2010-03-05 81 views
5

我知道編譯器可能執行或不執行函數的內聯擴展,無論程序員是否請求。
我只是好奇地想知道,有沒有什麼方法可以讓程序員知道編譯器已經內聯了一個特定的函數?內聯函數

+2

更合適的問題,有沒有什麼方法可以讓程序員確信編譯器已經內聯了一個特定的函數* call *? – Potatoswatter 2010-03-05 04:45:19

回答

10

除了通過查看生成的代碼,沒有。有些實現可能會提供這些信息,但這不是標準所要求的。

之類的東西inlineregister(顫慄)是建議編譯器,它是免費接受他們,不理會他們,甚至對你撒謊,它的完成它,而你背後偷偷去和沒有這樣做:-)

我傾向於不使用這樣的功能,因爲我懷疑編譯器通常比我知道如何從我的代碼中獲得最高性能。

0

閱讀目標文件的反彙編。

1

設置您的編譯器以生成彙編代碼並在那裏檢查。

+0

如果你有不同的debug v release版本標誌,請確保使用後者。我已經看到一些編譯器從不內聯,除非您至少啓用了一些優化。 – 2010-03-05 05:57:39

2

您可以分析您的代碼,並查看感興趣的功能是否顯示在調用堆棧中。儘管如此,我想不能保證您的堆棧採樣率是否不夠高。

但它可能證明它內聯:如果你知道A電話B,這就要求CA永遠不會調用C直接,如果你看到A調用堆棧上調用C,你知道B是內聯該調用。

0

除了查看輸出彙編程序之外,沒有辦法知道。

這些日子的編譯器是'聰明的',他們決定內聯什麼函數以及在什麼情況下。

就像register關鍵字一樣,編譯器這幾天都在挑選,而且真的忽略了你的請求。

0

我不認爲有一種方法來找出你想要什麼,

但是你可以增加功能的possibilites被內聯函數,

使得函數的定義可見到它被調用的翻譯單元。即你總是必須將頭文件中的內聯函數的定義。