对于一些频繁使用的小函数,如交换函数、加法函数,在函数调用时会频繁创建栈帧
很显然这是有消耗的,对于频繁调用的小函数,要该如何优化呢??
目录
下面以一个 简单的加法函数为例
int Add(int x,int y)
{
return x+y;
}
int main(){
int c = Add(1,2);
return 0;
}
一、C 提供的 宏函数
宏函数 本质上是 一种宏替换,是替换!!调用时形参会被实参替换,直接在调用的位置展开
#define Add(x,y) ((x)+(y))
int main() {
int c = Add(1, 2);
return 0;
}
下面检查一下上面的写法是否正确
实参 1 去替换 x,实参 2 去替换 y,宏定义变成了
#define Add(1,2) ((1)+(2))
然后我们把main函数中的Add替换
int main(){
int c = ((1)+(2));
return 0;
}
注意:
(1)宏定义中不能加分号,否则替换以后也会携带分号
(2)需要加 小括号,优先级:乘法 > 加法,加法 > 逻辑运算符
二、C++ 提供的 内联函数
从上面可以看出,宏的使用,比较复杂,使用起来很容易出错,当函数比较简单时,更推荐使用下面的内联函数
关键字是 inline,加在 函数返回值类型的前面
使用内联以后,调用函数时不会建立栈帧,而是在调用的地方直接展开
inline int Add(int x, int y)
{
return x + y;
}
int main() {
int c = Add(1, 2);
return 0;
}
加入内联inline以后
===》debug版本:默认不展开
===》release版本:会展开
1、debug 配置属性——在debug版本下展开内联
(1)右键点击项目属性property
(2)在 C/C++ —— 常规 和 C/C++ —— 优化 中
2、比对 普通函数 和内联函数
我们通过反汇编比对两者的区别
左边是普通函数,右边是内联函数
我们会发现,内联函数不会使用call指令,也就不会建立函数栈帧,直接在调用位置展开
注意:
(1)一般代码行数小于10行时,使用内联函数
(2)内联对于编译器只是建议,当函数中存在循环或者递归时,内联会被忽略,也就不会直接展开