内联函数与宏(inline & define)
使用inline修饰函数的声明或者实现,可以使其变成内联函数
写在声明或实现都可以,建议声明和实现都增加inline修饰。
内联函数声明必须在调用语句之前。
-
作用?
编译器会将函数调用直接展开为函数体代码
原本main函数中只有一行代码,但函数体中有三行代码,在编译时就会将一行代码自动展开成三行代码。-
有啥意义呢?
在调用函数时,会开辟栈空间,函数结束后会回收栈空间。
连续调用函数就会连续开辟回收栈空间。
——>> 内存开销较大
如果使用内联函数,编译器会自动将函数展开成函数体代码,就不存在函数调用和开辟回收栈空间,不会分配和回收内存,执行效率会变高。
——>> 减少函数调用的开销
但相应的会增大代码体积。
-
-
使用场景:
- 函数体体积不是很大
- 频繁调用的函数
-
注意
- 尽量不要内联超过10行代码的函数
- 不能存在任何形式的循环语句
- 不能存在过多的条件判断语句
- 有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数,编译器可能拒绝内联请求
- 内联函数声明必须在调用语句之前。
define:
- 只是简单的字符串替换,没有类型检查
- 是在编译的预处理阶段起作用
- 可以防止头文件重复引用
- 不分配内存,给出的是立即数,有多少次使用就进行多少次替换
内联函数与宏
- 都可以减少函数调用的开销
- 对比宏,内联函数多了语法检测和函数特性(传参)
输出:24而不是22
因为宏是简单的文本替换,替换后
int c = ++a + ++a;
注意:按运算符优先级来说,++ 在 + 的前面,所以先对 a 做两次 ++ 运算,然后再将 a 值相加。
输出:22
++ a = 11
作为参数传入add函数,所以返回就是11 + 11
。- 表达式
C++有些表达式是可以被赋值的。
先计算 (a = b) ,将b赋值给 a,返回 a
然后计算 a = 4, 将 4 赋值给 a,返回 a
最终 a = 4, b = 2
a = 1, b = 4
C++中可以,但C中不可以。