程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【轉載】 c語言inline函數的使用,轉載inline函數

【轉載】 c語言inline函數的使用,轉載inline函數

編輯:C++入門知識

【轉載】 c語言inline函數的使用,轉載inline函數


 c語言inline函數的使用 

轉載自:http://blog.chinaunix.net/uid-21843265-id-3056446.html

大學在教科書上學習過inline函數,定義為inline函數之後,會省去函數調用的開銷,直接嵌套匯編代碼,取代函數調用,提高效率。工作後項目中也 很少用到inline來定義函數,近幾天在研讀google的google c++ style guide,發現之前自己對inline函數的認識太過膚淺了,這裡學習總結一下。
1、inline函數不要超過10行代碼,且不能包含循環、switch、if語句
2、在一個c文件中定義的inline函數是不能在其它c文件中直接使用,google推薦把inline函數定義在**-inl.h頭文件中。
3、不要過度使用inline函數定義,尤其對大函數來說
上面三點說明如何正確的使用inline函數,我以前的時候對inline理解不透徹,使用inline的方式不正確,但現在編譯器夠先進,能保證錯誤的inline定義也可以正確編譯、運行。可能會有性能的缺失。
我在F14(gcc 版本 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC))上做了個實驗:
1、當inline函數超過10行,並且包含了循環、switch語句後gcc會執行inline語義,將inline函數匯編嵌入到main函數中。

 1 //gcc n.c -O2 -S 
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 //inline int inc_inline(volatile int *j);
 6 inline int inc_inline(volatile int *j)
 7 {
 8     for (;*j < 100; (*j)++)
 9     {
10         *j += 2;
11         (*j)++;
12     }
13     switch (*j)
14     {
15     case 1:
16         (*j)++;
17         break;
18     case 2:
19         (*j)++;
20         break;
21     default:
22         break;
23     }
24     
25     return (*j)++;
26 }
27 
28 
29 int main(int argc, char *argv[])
30 {
31     volatile int i = 0;
32     
33     inc_inline(&i);
34 
35     printf("i;%d\n", i);
36     
37     return 0;
38 }

2、當我把inline函數的定義放到另一個c文件中,在main函數文件中聲明此函數,此時inline函數不生效,gcc編譯出的匯編使用call進行正常的函數調用。
//gcc n.c a.c -O2 -S
3、當我們過度使用inline函數,會造成程序文件變大,性能降低。程序文件變大是肯定的,但為什麼性能會降低呢,inline不是為了提高性能嗎?使 用的方式不正確性能不能提高,反而會下降。現在的CPU上都有cache,緊湊的代碼在chache中保存的時間更長,這樣cache命中的機會更高。
如果某個A函數未定義為inline,並且被很多其它函數調用,那個這個A函數很大的可能會長期被保存在cahe中,這樣CPU對代碼的執行速度會提高很 多。如果A函數被定義為了inline函數,代碼分散各個調用函數中,這樣每次指定都不命中都需要去內存把代碼拷貝到cache中,然後執行,造成很大的 抖動。
更深一層的理解,當函數整個函數編譯為的匯編代碼,函數調用的上下文切換占用了大多的時間的時候,可以考慮把此函數定義為inline函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved