inline内联的效果
#include <stdio.h>inline int max(int x, int y) {return x > y ? x : y;
}int main() {int a = 5, b = 10;int m = max(a, b);printf("The maximum value is %d\n", m);return 0;
}
当编译器决定将max
函数内联时,它会在编译时期将函数调用替换为函数体,相当于直接在调用处写入了函数的内容。替代后的代码会看起来像这样:
#include <stdio.h>int main() {int a = 5, b = 10;// 内联展开后的代码int m = a > b ? a : b;printf("The maximum value is %d\n", m);return 0;
}
优势
通过将函数内联,编译器在编译时会将函数调用处直接替换为函数体本身的代码,而不是按照常规的函数调用过程(即,保存当前执行点、跳转到函数入口、执行函数、返回到调用处继续执行)来执行。
- 减少函数调用的开销:由于不需要进行函数调用的正常流程,因此可以减少一些执行上的开销,如参数传递、栈帧管理等。
- 提高程序执行速度:直接替换代码可以让编译器更好地进行优化,比如更有效地利用寄存器、更好地预测分支等,从而提高程序的执行速度。
- 增加编译器优化的机会:内联函数由于在编译时就展开了,编译器可以根据具体的调用上下文来对代码进行进一步优化。
劣势
过度使用内联可能会导致代码体积的增加(因为每个调用点都替换为了函数体,直观感觉就是代码量激增,占用的存储就多了),这在某些情况下可能会影响程序的性能(比如,增加缓存的压力)。
注意事项
inline
关键字只是向编译器提出一个建议,是否进行内联,以及内联的方式,最终决定权在编译器。