inline 与 define

xiaoxiao2021-02-28  77

inline函数(内联函数)是C++相对于C的一个新特性,它长这样:

inline double square(double x) { return x * x; };

为什么要有这么一个新特性呢?

程序都是由一条一条指令组成的,要运行程序的时候,操作系统把这些指令载入到内存,CPU再一条一条 地执行这些指令。一般情况下,执行到一条函数调用的指令时,程序要先存储这条指令的内存地址,把函 数参数复制到堆栈中,再跳到函数起点的内存单元处去执行函数代码,执行完了还要再跳回到调用函数的 地方,然后才能继续往下执行。这些跳来跳去的过程都需要一定的时间开销,C++的一大追求就是快、高 效,对于这种浪费时间的行为当然不能忍,于是就有了inline函数。

内联函数,顾名思义,就是把函数代码都塞到函数调用的地方去,执行的时候就不需要再跑来跑去了,节 省了时间。

内联函数声明只需要在普通的函数声明前面加一个inline就行了,再顾名思义一下,inline,就是在一 行里面,所以一般内联函数都写在一行里面,如果函数代码有很多行的话一般是不用内联的,道理其实很 简单,一行代码的执行时间很短,如果用一般的函数的话中间跳来跳去的时间相对于函数执行的时间还是 比较多的,但如果函数本身有很多行,自己执行就要不少时间,那中间这个跳来跳去的时间相对于函数代 码执行的时间就可以忽略不计了,所以内联函数一般只有一行。

看到这里,肯定有很多人想到了C语言的宏定义#define, 例如上面那行代码可以用宏定义这样实现:

#define square(x) ((x)*(x))

被坑过的人肯定都知道变量都要用括号括起来,这样一来对于square(4.0)、square(4.0+5.0)这 样的调用似乎用内联函数还是宏定义并没有什么区别。

然鹅, 如果这样用呢:

square(a++);

a是一个double变量。

由于宏只是简单的替换,将会导致最后这一行执行完后a自加了两次(把宏展开就看得清楚了,我懒,就不 写了。。。),而使用内联函数则不会出现这种问题,并且不需要每次都小心翼翼地把变量括起来,所以 内联函数的功能是远远胜过宏定义的,因此

能用inline就不要用define!

这里说的是内联函数和宏的功能一样的时候内联函数是最优选择,但有时候还是有些十分炫酷的奇技淫巧 会用到宏的,比如可以用一个宏来生成不同的函数,有兴趣可以自己去查查看。

转载请注明原文地址: https://www.6miu.com/read-45135.html

最新回复(0)