2011-07-15 55 views

回答

11

From the C++ FAQ:

當編譯器內聯展開一個函數調用,該函數的代碼 被插入到呼叫者的碼流(概念上類似於 與#define宏會發生什麼)。這可以取決於其他事情,提高性能,因爲優化器可以在程序上集成被調用代碼 - 優化被調用代碼到調用者的 中。

有幾種方法可以指定一個函數是內聯的,其中一些涉及inline關鍵字,另一些則不涉及inline關鍵字。無論您如何將內聯函數指定爲函數,它都是允許編譯器 忽略的請求:它可能會內聯地擴展某些內聯函數的一部分或全部或不包含任何 調用。 (不要灰心,如果看起來 絕望模糊,上面的靈活性實際上是一個巨大的優勢:它允許編譯器處理大的函數與小的函數不同 ,再加上它允許編譯器生成易於使用的代碼 如果選擇正確的編譯器選項,則調試。)

在最簡單的情況下,內聯函數被放入其調用站點,就像您將其複製並粘貼到那裏一樣。因此,對於,

inline int madd(int a, int b, int c) 
{ 
    return a * b + c; 
} 


void foo(int data[3]) 
{ 
    int result = madd(data[0], data[1], data[2]); 
    printf("%d\n", result); // note to pedants: this is simpler than a cout stream, so there 
} 

的編譯器可以把它變成

void foo(int data[3]) 
{ 
    int result = data[0] * data[1] + data[2] ; // madd is replaced inline 
    printf("%d\n", result); 
} 
+1

或者它可以完全忽略「內聯」指令。編譯器是這樣反覆無常的。 – Crashworks

+0

'inline'指令不能被完全忽略(因爲它指定了函數的不同ODR行爲)。然而,是否內聯代碼的決定可以獨立於是否存在「內聯」指令。 –

0

直列是編譯器的建議。如果編譯器可以在執行其他優化時執行此操作,它將內聯該函數,這意味着它會將函數內容「內聯」在調用位置,從而避免創建堆棧和調用開銷。但是,如上所述,這是一個建議,編譯器不需要這樣做

1

通過內聯函數,我們可以避免函數開銷,我們也可以節省執行時間。

Example: inline mul (int a, int b) 
{ 
int multi; 
multi = a * b; 
} 

通過這一點,我們能夠避免功能的開銷(指存儲在堆棧推&彈出操作中的PC)

2

通過聲明一個函數內聯,則該函數被替換爲它定義直接其中它被稱爲。它節省了執行時間,因爲一般的方法調用通常包括對該函數的控制傳輸,並以不同的方式爲該執行提供內存。

通過執行內聯,函數以內聯方式執行,從而將控制轉移移除到該函數的主體。

通常,函數通過在其聲明中在其返回類型之前添加關鍵字inline來進行內聯。

+0

+ 1,只記得「函數在C++中,方法在java中」 – nobalG

相關問題