c++之内联函数

概念:

以inline修饰的函数叫做内联函数,内联函数会在编译时展开,没有函数压栈的开销,提高程序运行的效率。

inline int add(int x, int y)
{
	return x + y;
}
int main()
{
	add(1, 2);
	return 0;
}

简单来说,内联函数就是以空间换时间

release版本下可以查看汇编是否存在call add

在debug版本下,编译器默认不会对代码优化,所以需要更改编译器设置

宏的优缺点?

宏的优点:增强代码的复用性,提高性能

宏的缺点:1.不易检查,宏是在预处理阶段进行简单的文本替换,在编译期间才会进行严格的类型                       检查

#include <stdio.h>
#define ADD(a, b) a + b

int main() {
    int result = ADD(1, 2; // 这里故意少了一个右括号
    printf("%d\n", result);
    return 0;
}

编译器通常会把错误位置定位到替换后的代码行,也就是 int result = 1 + 2; 这一行,而不是最初写 ADD(1, 2;

2.缺乏类型检查

#define MULTIPLY(a, b) a * b
int x = 5;
float y = 3.2;
int result = MULTIPLY(x, y);

宏在展开时不会检查 x 和 y 的类型是否适合进行乘法运算,编译器可能在后续处理中报错,但难以直观判断是宏定义的使用问题。

3.会导致副作用

#define MAX(a, b) ((a) > (b)? (a) : (b))
int i = 2;
int max_val = MAX(i++, 3);

宏展开后 i 会被多次自增,可能产生不符合预期的结果,而且这种副作用问题在代码检查时不容易发现。

哪些技术可以替代宏?

1.常量定义换用const

2.函数定义换用内联函数

总结:

内联函数可以提高效率,但代码很长或者有循环/递归都不适用,只适合短的代码,比如交换两个值的函数?

并且加了inline是否会在相应的位置展开?取决于编译器?inline只是给编译器一个建议并不是一定会展开。

内联函数不建议定义和声明分离,分离会导致链接错误,因为inline被展开之后就没有函数地址了,这样就链接时就无法找到函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值