宏函数与内联函数

对于一些频繁使用的小函数,如交换函数、加法函数,在函数调用时会频繁创建栈帧

很显然这是有消耗的,对于频繁调用的小函数,要该如何优化呢??


目录

一、C 提供的 宏函数

二、C++ 提供的 内联函数

1、debug 配置属性——在debug版本下展开内联

2、比对 普通函数 和内联函数


下面以一个 简单的加法函数为例

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)内联对于编译器只是建议,当函数中存在循环或者递归时,内联会被忽略,也就不会直接展开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值