【概念介绍】
内联函数是C++为提高程序运行速度而做的一项改进。
首先了解代码运行的原理:
编译——产生可执行文件(里面全是二进制机器指令)
运行——将二进制机器指令加载到内存,每个函数有自己的内存位置。调用函数时,程序将跳转到另一个地址(函数地址),调用完函数之后再跳转回去。在内存中来回跳跃需要一定的开销。
内联——在编译时,将内联函数的二进制代码直接嵌入到调用的地方。好处是不需要跳转,速度快;坏处是占用更多的内存。(如果程序在10个不同的地方调用同一个内联函数,则该程序将包含函数的10个二进制副本。)
所以,内联适合函数体短小而调用次数多的函数。
【使用方法】
①加上关键字inline
②将整个定义写在声明的地方(如果函数体有多行,说明可能函数体太长,不适合内联)
inline int square(int x) { return x*x; }
【注意事项】
①程序员请求inline,但编译器不一定会实行,有可能编译器注意到函数太长
②递归的函数不能内联(编译时无法得知调用多少次,所以不知道要嵌入多少份)
【内联与宏】C++的内联功能远胜于C的宏定义
//内联函数
inline int square(int x){ return x*x; }
//宏定义函数
#define SQUARE(X) X*X
内联函数使用上与函数一样,宏定义则只是简单的替换,如:
SQUARE(12) | 正常 |
SQUARE(v1 + v2) | v1 + v2 * v1 + v2 运算次序错误 |
SQUARE(a++) | a++ * a++ 自增了两次 |
如果使用C语言的宏实现了类似函数的功能,应考虑将其转为C++。