在爲內聯函數指定調用約定時有沒有意義?例如,我正在寫SIMD數學庫,建議使用__vectorcall
,但我所有的函數都是內聯的。在一些文章中,我看到人們將所有函數內聯,並且仍然說,你需要用默認的__vectorcall
約定(或者實際上將這個屬性)編譯庫。
當函數不是內聯時,我可以看到程序集中的差異。但是,爲內聯函數指定調用約定有什麼意義,因爲它不是一個真正的函數調用?爲內聯函數指定__vectorcall
不是更好嗎?內聯函數和調用約定
回答
inline關鍵字只是編譯器的一個建議;它不保證該函數將被內聯。例如,遞歸函數不能內聯,如果使用函數指針,編譯器可能需要生成其他內聯函數的非內聯副本。此外,對內存和空間的限制可能會阻止編譯器內聯一個函數。因此,即使你標記了一個函數內聯,你仍然需要指定一個調用約定(如果合適的話),因爲不能保證編譯器確實會消除函數調用。
「遞歸函數不能內聯」如果編譯器能夠優化遞歸到迭代中,它可以內聯。如果編譯器能夠在編譯時預測遞歸深度,它可以被展開和內聯...... –
@Revolver_Ocelot這是真的,儘管通常編譯器無法做到這一點(謝謝,Halting Problem!)你知道嗎任何編譯器在除尾調用以外的其他情況下執行此操作? – templatetypedef
GCC和Clang都努力將不完全尾遞歸轉化爲迭代。我沒有證據表明部分內聯不可優化的遞歸函數 –
- 1. 函數指針和調用約定
- 2. 函數調用約定
- 3. jQuery - 調用內聯函數
- 4. 內聯函數調用靜態內聯函數
- 5. 代碼約定函數和回調
- 6. 調用約定函數返回結構
- 7. boost :: function_types函數調用約定
- 8. ASM內聯調用C外部函數
- 9. 可以HotSpot內聯lambda函數調用?
- 10. 調用靜態內聯函數
- 11. Javascript調用函數或內聯代碼?
- 12. 預處理宏調用內聯函數
- 13. 夫特回調內聯函數用法
- 14. Queryable Select中的內聯函數調用
- 15. 內聯函數調用錯誤
- 16. 約構造函數調用和繼承
- 17. 內聯函數定義
- 18. 總和類型函數參數的GHC調用約定
- 19. 內聯函數和靜態內聯函數之間的區別
- 20. Postgresql和內聯函數
- 21. 互斥和內聯函數
- 22. C,內聯函數和GCC
- 23. get/set函數和內聯
- 24. 自定義X86_64調用約定到C函數調用
- 25. 調用內聯函數時未定義的引用
- 26. 內聯彙編:註冊引用約定
- 27. OpenCL用戶定義的內聯函數
- 28. 函數定義之前的調用不能被內聯?
- 29. 從內聯事件調用的自定義jQuery函數
- 30. 內聯函數
http://stackoverflow.com/a/36852518/2542702 –