我必須檢查一個函數是否被編譯器內聯。有沒有辦法做到這一點,而不看着大會(我不讀)。我沒有辦法解決這個問題,所以我寧願如果我們不能討論這樣做的智慧。謝謝!MSVC - 任何檢查函數是否實際內聯的方法?
回答
生成一個「MAP」文件。這給你所有非內聯函數的地址。如果你的函數出現在這個列表中,它不是內聯的,否則它會被內聯或完全優化(例如,當它不被調用時)。
每個呼叫站點可能有所不同。
編譯器可能會決定某些父級方法值得內聯,而其他父級方法則不值得內聯。因此,如果不在每個呼叫站點檢查彙編,您都不能真正確定答案。
因此,您使用的任何工具都可能會給您一個誤導性的答案。如果你使用一個工具來檢查符號的存在(它可能在那裏,因爲一些呼叫站點需要它,但可能會在其他地方內聯)。相反,缺少符號並不意味着方法/函數沒有內聯,它可能是靜態的(如文件靜態),因此編譯器不需要保留符號(但沒有內聯)。
使用/ FAs編譯器選項轉儲源代碼的asm是我知道的唯一方法是確定的。
注意:如果你想強制一個函數內聯,只需使用__forceinline
。
如果你真的不想跳進程序集,請將函數聲明爲__forceinline,並且如果可執行文件變大,則說明它未被內聯。
不一定。例如,典型的成員獲取函數實際上可以在內聯時導致更小的代碼。這將導致通過這個指針訪問成員,而不是通過這個指針來訪問,調用函數,通過this訪問成員,從函數返回。 – 2009-12-14 19:49:29
確實如此,但是如果它已經被排隊,__forceinline不應該改變任何東西,所以我應該說的是如果可執行文件改變大小。接得好。 – Overflowed 2009-12-14 22:55:41
-1,問題在於理查德給出的理由相反。如果可執行文件不改變其大小,你可以得出什麼結論? – MSalters 2009-12-15 11:03:12
如果啓用警告C4714,C4710和C4711,它應該給你提供關於哪些功能是內聯的相當詳細的信息。
- 1. 如何使用MethodByName檢查實際函數是否存在?
- 2. 任何方式來檢查是否檢測到哈爾級聯?
- 3. JPA:更好的方法來檢查實體是否有關聯
- 4. 如何使用jsoup檢測內聯js函數?我基本上想檢查內聯函數是否存在。
- 5. 如何檢查移動數據是否實際活動或WiFi實際連接到任何熱點?
- 6. 如何檢查是否AWS實例實際上是提供
- 7. 檢查ServletResponse是否有任何內容
- 8. 檢查,看是否任擇議定書方法已經實施
- 9. 是否可以創建一個不是實際內聯的內聯塊?
- 10. 檢查python函數是否內置
- 11. 內聯函數/方法
- 12. 檢查內聯函數內部的變量值
- 13. 檢查方法C#中的內聯
- 14. 如何檢查方法參數是否實現多個接口
- 15. 如何檢查函數是否被方法調用?
- 16. 如何檢查函數是否在模擬方法中調用?
- 17. LLVM是否將Objective-C方法轉換爲內聯函數?
- 18. 檢查用戶是否實際評價應用程序的方法
- 19. 任何方式來檢查一個實例是否仍在內存中?
- 20. 檢查實例化視圖是否包含任何行的最快方法
- 21. c中是否有任何逆變的實際用法?
- 22. 檢查是否有任何與Tkinter預定的方法AFTER
- 23. 任何檢查XmlSchemaParticle是否爲EmptyParticle的方法?
- 24. 檢查函數調用是否存在任何參數
- 25. 檢查範圍內的任何模數是否爲零
- 26. 是否有可能檢查給定函數是否在其他函數或方法內執行?
- 27. 用於android.net.conn.CONNECTIVITY_CHANGE的BroadcastReceiver實際上是否檢查互聯網連接?
- 28. 檢查數據(堆)是否實際被換出?
- 29. 檢查PDF是否實際上是一個帶有PHP的PDF
- 30. 是否可以檢查Chrome的實際UI(不是devtools)?
__forceinline不強制在所有情況下內聯。 http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx – 2009-12-14 21:01:38