c語言inline函式的使用方法2012-01-20 00:00 中國it實驗室 佚名 ..關鍵字:c語言 大學在教科書上學習過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函式中。
//gcc n.c -o2 -s
#include
#include
//inline int inc_inline(volatile int *j);
inline int inc_inline(volatile int *j)
for (;*j < 100; (*j)++)
*j += 2;
(*j)++;
switch (*j)
case 1:
(*j)++;
break;
case 2:
(*j)++;
break;
default:
break;
return (*j)++;
int main(int argc, char *argv)
volatile int i = 0;
inc_inline(&i);
printf("i;%d\n", i);
return 0;
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函式。
c語言中inline函式
發表於2011 年 01 月 26 日 由admin c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸 ...
c語言中的inline
在c中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函式的死迴圈遞迴呼叫的最終結果...
c語言中的的內聯 inline 函式
發表於2011 年 01 月 26 日 由 admin c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸...