概念:
以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被展开之后就没有函数地址了,这样就链接时就无法找到函数。