我們有一個共同的事業庫,是這樣的信號錯誤宏:什麼是規則編譯器用來決定是否內聯函數的實際集合?
#define OurMacro(condition) \
if(condition) { \
} else { \
CallExternalFunctionThatWillThrowAnException(parametersListHere); \
} \
我稱之爲parametersListHere
是由編譯器在每個人口常量和宏以逗號分隔的列表宏觀擴張。
該函數調用總是會解析爲一個調用 - 函數實現不會暴露給編譯器。該函數有六個參數,在調試配置中,它們都具有有意義的值,而在發佈配置中,只有兩個具有有意義的值,而其他參數則傳遞相同的默認值。
通常這個條件會成立,所以我不關心這個調用的速度有多快,我只關心代碼膨脹。使用6個參數調用該函數需要7條x86指令(6個push
es和一個call
),並且如果函數簽名被更改爲僅有兩個參數,則可以避免使用那些push
es中的4個 - 這可以通過引入中間「門「功能以這種方式實現,編譯器不可見。
我需要估計我是否應該堅持這種改變。到目前爲止,我期望的主要改進是,減少參數的數量將在每次調用時減少4條指令,這意味着圍繞宏擴展的代碼將變得更小,編譯器將更有可能地內聯代碼並進一步優化發出的代碼。
我如何估計,而不是實際嘗試和重新編譯我們所有的代碼,並仔細分析發出的代碼?每當我讀到inline
時,都會有一個聲明,編譯器決定是否內聯該函數。
我可以看到一些關於函數內部函數如何影響編譯器決定內聯的準確規則嗎?
任何原因你沒有2個不同的功能`#ifdef NDEBUG`開關? – 2011-02-10 10:37:09
@Matthieu M .:原始函數可能已經從我不知道的一些代碼中調用。無論如何,使用新功能或通過改變現有功能簽名,我可以達到完全相同的結果,所以選擇哪種方式並不重要。 – sharptooth 2011-02-10 10:39:47