天天看點

關于C語言中的inline

在c中,為了解決一些頻繁調用的小函數大量消耗棧空間或是叫棧記憶體的問題,特别的引入了inline修飾符,表示為内聯函數。

棧空間就是指放置程式的局部資料也就是函數内資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函數的死循環遞歸調用的最終結果就是導緻棧記憶體空間枯竭。

下面我們來看一個例子

#include <stdio.h>
//函數定義為inline即:内聯函數
inline char* dbtest(int a) {
    return (i % 2 > 0) ? "奇" : "偶";
} 

int main()
{
   int i = 0;
   for (i=1; i < 100; i++) {
       printf("i:%d    奇偶性:%s /n", i, dbtest(i));    

   }
}      

上面的例子就是标準的内聯函數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在内部的工作就是在每個for循環的内部任何調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧記憶體重複開辟所帶來的消耗。

inline的使用是有所限制的,inline隻适合涵數體内代碼簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,并且不能内聯函數本身不能是直接遞歸函數(自己内部還調用自己的函數)。

補充:

inline函數僅僅是一個建議,對編譯器的建議,是以最後能否真正内聯,看編譯器的意思,它如果認為函數不複雜,能在調用點展開,就會真正内聯,并不是說聲明了内聯就會内聯,聲明内聯隻是一個建議而已.

其次,因為内聯函數要在調用點展開,是以編譯器必須随處可見内聯函數的定義,要不然,就成了非内聯函數的調用了.是以,這要求每個調用了内聯函數的檔案都出現了該内聯函數的定義。

是以,将内聯函數放在頭檔案裡實作是合适的,省卻你為每個檔案實作一次的麻煩.而是以聲明跟定義要一緻,其實是指,如果在每個檔案裡都實作一次該内聯函數的話,那麼,最好保證每個定義都是一樣的,否則,将會引起未定義的行為,即是說,如果不是每個檔案裡的定義都一樣,那麼,編譯器展開的是哪一個,那要看具體的編譯器而定.是以,最好将内聯函數定義放在頭檔案中.

而類中的成員函數預設都是内聯的,如果在類定義時就在類内給出函數,那當然最好.如果在類中未給出成員函數定義,而又想内聯該函數的話,那在類外要加上inline,否則就認為不是内聯的.

為了友善,将内聯函數直接聲明時就定義,放在頭檔案中.這樣其它檔案包含了該頭檔案,就在每個檔案都出現了内聯函數的定義.就可以内聯了.

繼續閱讀