1:什么是内联函数?
函数声明的时候,在定义的地方增加inline关键字说明(注意是定义的地方不是声明的地方),则此函数为内联函数。
2:为什么要使用内联函数?
主要为性能考虑,减少因为函数调用引起开销,主要是参数压栈、栈帧开辟与回收,以及寄存器保存与恢复等。
3:为什么推荐使用内联函数代替宏?
因为宏容易出错,且不可调试。
4:使用内联函数的注意事项。
内联函数应该尽可能的简单短小,过长的函数,使用内联将导致内存消耗增大。
5:怎么使内联函数生效?
我们声明了内联函数,但是编译器可能不执行内联,所以要确定开启内联选项。
测试代码如下:
1 #include <iostream> 2 #include <time.h> 3 4 using namespace std; 5 int calc1(int a, int b) 6 { 7 return a + b; 8 } 9 10 //inline int calc2(int a, int b) __attribute__((always_inline)); //强制开启内联选项 11 inline int calc2(int a, int b) 12 { 13 return a + b; 14 } 15 16 #define CALCE(a, b) a + b 17 18 int main(int argc, char *argv[]) 19 { 20 int x[10000] = {0}; 21 int y[10000] = {0}; 22 int z[10000] = {0}; 23 cout << "begin function" << endl; 24 time_t t = time(NULL); 25 for (int i = 0; i < 10000; ++i) 26 { 27 for (int j = 0; j < 1000; ++j) 28 { 29 for (int k = 0; k < 1000; ++k) 30 { 31 calc1(x[j], y[k]); 32 } 33 } 34 } 35 cout << "function used:" << (time(NULL) - t) << "秒" << endl; 36 cout << "begin inline" << endl; 37 t = time(NULL); 38 for (int i = 0; i < 10000; ++i) 39 { 40 for (int j = 0; j < 1000; ++j) 41 { 42 for (int k = 0; k < 1000; ++k) 43 { 44 calc2(x[j], y[k]); 45 } 46 } 47 } 48 cout << "inline used:" << (time(NULL) - t) << "秒" << endl; 49 50 cout << "begin define" << endl; 51 t = time(NULL); 52 for (int i = 0; i < 10000; ++i) 53 { 54 for (int j = 0; j < 1000; ++j) 55 { 56 for (int k = 0; k < 1000; ++k) 57 { 58 CALCE(x[j], y[k]); 59 } 60 } 61 } 62 cout << "define used:" << (time(NULL) - t) << "秒" << endl; 63 return 0; 64 }
不开启内联选项的情况:
普通和内联函数基本没有差异, 宏的效率会高一些。
开启内联选项:
证明内联函数在大量调用的情况下,会有明显的效率提升。
注:本文不讨论g++编译的优化选项的问题-O, 因为优化后的程序测试,测试结果会有很多其他因素,后续单独整理。
原文链接: https://www.cnblogs.com/6-er-mi-hou/p/13158104.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/356679
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!