内联函数

先看一段代码:

  

问题:

  进出 getMax 的开销,比 getMax 函数本身的开销还要大

如果使用宏:

1 #define GETMAX(a,b) ((a)>(b)?(a):(b))
2 
3 int main() {
4     int n1 = GETMAX(1, 2);  // 等价于直接写 int n1 = (1)>(2)?(1):(2);
5     return 0;
6 }

宏跟函数的区别:宏是替换;如果使用宏,相当于编译器把宏里面规定的代码直接放到了 使用宏的那里

 

使用 宏 的问题,举个例子:

 1 #define GETMAX(a,b) ((a)>(b)?(a):(b))
 2 
 3 int main() {
 4     int a = 10;
 5     int n1 = GETMAX(a++, 2);
 6     // 上一行相当于 int n1 = ((a++)>(2)?(a++):(2));
 7     cout << "a = " << a << endl;
 8     cout << "n1 = " << n1 << endl;
 9     return 0;
10 }

res:

  

原代码看似只执行了一次 a++,a 应该等于 11,但是运行结果显示 a = 12.

这是因为int n1 = GETMAX(a++,2);等价于写int n1 = ((a++)>(2)?(a++):(2));

第一次比较的时候,比较的是 a = 10 和 2,随后 a 进行了一次自增变为 11. 然后 n1 被赋值为 11.

n1 被赋值之后,a 又进行了一次自增(第二个 a++ 的位置),此时 a 变为了 12.

 

既利用了函数传参,又不像函数调用那样的代价:内联函数

内联函数语法:在定义函数前加 inline

1 inline int getMax(int a, int b) {
2     return a > b ? a : b;
3 }

 

内联函数 通常放在头文件

如果一个头文件中定义(不是声明)了一个普通函数(不是内联函数),然后这个.h 头文件分别被好几个.cpp 文件包含,那么编译代码时不用过,原因是头文件的普通函数被这几个.cpp重定义了;

而头文件中定义内联函数,然后这个头文件被好几个.cpp 文件包含,就不会出错,因为.cpp 文件在使用内联函数时,相当于直接把内联函数的代码放到了使用内联函数的位置上(相当于宏),也不存在函数调用,开销小(但是如果内联函数过于复杂,开销并不小,甚至比函数调用还大)。

 

内联函数 和 宏 的区别

1. inline在编译期间展开(将实参传递给形参,使用函数的代码替换函数的调用);而宏在预处理时进行文本替换

2. 宏定义不检查函数参数和返回值,只是展开;内联函数是真正的函数,会检查参数类型,更安全

 

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

posted @ 2023-11-09 16:04  我会变强的  阅读(28)  评论(0)    收藏  举报