记:C++基础之二、内联函数``inline``
GitHub C++基础知识
二、内联函数inline
- 内联函数一般是小型的一至五行左右,且频繁调用的函数。与C语言中的
#define
类似。
inline int max(int a, int b) {
return a>b?a:b;
}
2.1. 原理
当编译器看到inline
后,为该函数创建一段代码,以便在以后每次碰到该函数调用时都用一段代码来替换。
- 这样可以避免频繁调用函数对栈内存重复开辟所带来的消耗,降低调用成本。
- 然而这样也会增加可执行文件的大小。
2.2. 特点
- 相当于把函数里面的内容写在调用函数处。
- 不用进入函数的步骤,直接进入函数体。
- 相当于宏,但比宏多了类型检测,真正具有函数特性。
- 不能包含循环、递归、switch等复杂操作。
- 在类中定义的成员函数,除了虚函数,其他的函数都会隐式地当成内联函数。
2.3. 内联函数的缺点
- 内联函数会增加可执行文件的大小。
- 内联函数的改变需要重新编译,不能直接链接。
- 是否内联是不可控的,取决于编译器。
2.3. inline
和#define
的区别
- 宏代替小函数有缺陷
inline int max(int a,int b) {
return a>b?a:b;
}
#define MAX(a,b) ((a)>(b)?(a):(b))
若a>b
,则对于上面的内联和宏定义,max(a++)≠MAX(a++,b)
。对于左边内联函数返回的是a
(使用的是未加之前的a),而对于右边宏定义→a++>b?a++:b
返回的是(a+1)++
,即a+1
。
- 内联函数会做类型检测或自动类型转换,宏定义不会。
- 类中声明、类中定义的成员函数,后者会自动转换为内联函数,可以访问成员变量,而宏定义的函数不可以。
- 内联函数在运行期间可以调试,而宏不可以。