2014-09-22 9 views
4

我正在閱讀關於C++中的內聯函數,大部分我理解的是編譯器會複製粘貼內聯的函數代碼。如果一個內聯函數包含一個return語句,並且該函數在某個其他函數中使用,它是否會導致調用者函數終止並返回?在C++中的內聯函數中返回語句是否會實際返回並終止代碼流?

例如,考慮

inline int foo(void) { 
return 1; 
} 

int bar(void) { 
//Some statements 
foo() 
//Some more statements 
return 2; 
} 

將禁止前foo()bar()回報達到return 2;行,因爲代碼被編譯器複製粘貼?否則,如何在內聯函數中處理return語句?我明白,現在不會破壞代碼流,但如果代碼是複製粘貼或內聯的,則如何處理return語句?

+6

在這種情況下,行爲與內聯無關。 – EdChum 2014-09-22 10:19:40

+1

不會。這意味着如果某個函數被內聯,代碼的行爲將會發生變化,並且這會使內聯變得毫無用處/危險。 – juanchopanza 2014-09-22 10:20:19

回答

7

內聯函數不僅僅是一個簡單的複製粘貼過程(與預處理器宏相反)。它們的行爲與普通函數類似,所以任何返回值都會像調用普通函數一樣反映給調用者。

+0

一些編譯器可能有問題。我只是試圖在類中調用靜態內聯int函數。 ADI編譯器在調用時會產生錯誤。當我放棄「內聯」關鍵字時,一切正常。 – 2016-11-03 14:31:17

+0

@Günter我懷疑它,但不知道錯誤是什麼,我不能說你做錯了什麼。例如,你可能已經傳遞了一個函數指針,指向代碼中某處的內聯函數;內聯函數顯然沒有地址,因此錯誤... – 2016-11-03 14:49:41

2

優化通常不會改變代碼的可觀察行爲。在C++中,除少數情況外(浮點運算重新排序,複製elision),情況都是如此。內聯函數不會改變程序的代碼流。

0

認爲函數好像它們是計算值的規則,而不是返回的東西。這只是一個return關鍵字說,如果控制到達關鍵字,則當前函數計算的值是關鍵字旁邊的任何值,並且當前函數應立即退出(無條件跳轉到當前函數的關閉{)。

在你的例子中,一些函數foo()被編程爲返回1。如果它沒有內聯,那麼編譯器會發出代碼,確實將1放在調用者希望找到它的地方,並且返回的指令返回。如果它沒有內聯 - 好吧,編譯器在任何時候都會看到函數結果爲1,並編譯適當調用此函數的代碼 - 無論函數結果是否被使用,它只是「插入」1。在你的例子中foo()結果沒有被使用,所以編譯器只是忽略結果,函數調用被編譯爲no-op。