2009-12-14 48 views

回答

1

生成一個「MAP」文件。這給你所有非內聯函數的地址。如果你的函數出現在這個列表中,它不是內聯的,否則它會被內聯或完全優化(例如,當它不被調用時)。

5

每個呼叫站點可能有所不同。

編譯器可能會決定某些父級方法值得內聯,而其他父級方法則不值得內聯。因此,如果不在每個呼叫站點檢查彙編,您都不能真正確定答案。

因此,您使用的任何工具都可能會給您一個誤導性的答案。如果你使用一個工具來檢查符號的存在(它可能在那裏,因爲一些呼叫站點需要它,但可能會在其他地方內聯)。相反,缺少符號並不意味着方法/函數沒有內聯,它可能是靜態的(如文件靜態),因此編譯器不需要保留符號(但沒有內聯)。

2

使用/ FAs編譯器選項轉儲源代碼的asm是我知道的唯一方法是確定的。

注意:如果你想強制一個函數內聯,只需使用__forceinline

+0

__forceinline不強制在所有情況下內聯。 http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx – 2009-12-14 21:01:38

0

如果你真的不想跳進程序集,請將函數聲明爲__forceinline,並且如果可執行文件變大,則說明它未被內聯。

+1

不一定。例如,典型的成員獲取函數實際上可以在內聯時導致更小的代碼。這將導致通過這個指針訪問成員,而不是通過這個指針來訪問,調用函數,通過this訪問成員,從函數返回。 – 2009-12-14 19:49:29

+0

確實如此,但是如果它已經被排隊,__forceinline不應該改變任何東西,所以我應該說的是如果可執行文件改變大小。接得好。 – Overflowed 2009-12-14 22:55:41

+0

-1,問題在於理查德給出的理由相反。如果可執行文件不改變其大小,你可以得出什麼結論? – MSalters 2009-12-15 11:03:12

6

如果啓用警告C4714,C4710和C4711,它應該給你提供關於哪些功能是內聯的相當詳細的信息。

相關問題