2016-06-18 66 views
1

在爲內聯函數指定調用約定時有沒有意義?例如,我正在寫SIMD數學庫,建議使用__vectorcall,但我所有的函數都是內聯的。在一些文章中,我看到人們將所有函數內聯,並且仍然說,你需要用默認的__vectorcall約定(或者實際上將這個屬性)編譯庫。
當函數不是內聯時,我可以看到程序集中的差異。但是,爲內聯函數指定調用約定有什麼意義,因爲它不是一個真正的函數調用?爲內聯函數指定__vectorcall不是更好嗎?內聯函數和調用約定

+0

http://stackoverflow.com/a/36852518/2542702 –

回答

4

inline關鍵字只是編譯器的一個建議;它不保證該函數將被內聯。例如,遞歸函數不能內聯,如果使用函數指針,編譯器可能需要生成其他內聯函數的非內聯副本。此外,對內存和空間的限制可能會阻止編譯器內聯一個函數。因此,即使你標記了一個函數內聯,你仍然需要指定一個調用約定(如果合適的話),因爲不能保證編譯器確實會消除函數調用。

+0

「遞歸函數不能內聯」如果編譯器能夠優化遞歸到迭代中,它可以內聯。如果編譯器能夠在編譯時預測遞歸深度,它可以被展開和內聯...... –

+0

@Revolver_Ocelot這是真的,儘管通常編譯器無法做到這一點(謝謝,Halting Problem!)你知道嗎任何編譯器在除尾調用以外的其他情況下執行此操作? – templatetypedef

+0

GCC和Clang都努力將不完全尾遞歸轉化爲迭代。我沒有證據表明部分內聯不可優化的遞歸函數 –