我認爲定義爲內聯遞歸函數不會有任何影響,也不會被內聯做出的。因爲,編譯器不知道有多少級別來複制內聯函數的代碼。有什麼想法嗎?
7
A
回答
3
我試着瀏覽相關的SO問題,爲你找到一個明確的現有答案,但是唉...…
所以,keywoard inline
(或成員函數是隱式地內聯通過在類定義中所定義)有兩個作用:
它保證,該函數可以在多個轉換單元,而不被限定違反一個定義規則,即在實踐中,沒有鏈接者抗議多個定義。對於此用途,所有功能的定義必須是
inline
,並且它們必須相同。它作爲一個模糊的提示給編譯器來內聯調用函數的機器代碼。一些呼叫可以內聯,有些不是。內聯的程度可能會有所不同,編譯器甚至可能會完全忽略這個提示(實際上,g ++傾向於按照提示去荒謬,也許程度不高,而Visual C++更喜歡忽略它)。
對於一個遞歸函數,如果一個如下編譯該函數的任何特定呼叫的提示,則該呼叫可以被擴展爲遞歸的一個或兩個或三個或任何水平。這是一件困難的事情,所以不要指望它。此外,編譯器’自己的內聯啓發式可能比你的直覺更好,因爲編譯器擁有的東西(它知道更多)更全局的觀點,因此,在總結:
請勿使用inline
暗示效果,將其用於ODR保證。
你在哪裏重新’絕對確保你知道優於編譯器,並在您已通過的原則,如「測量第一」,並遵守「不這樣做過早優化」,你可以得到更多的通過編譯器特定的語言擴展或編譯指示可靠地控制內聯。
乾杯&心連心,
0
2
很顯然,這將無法重複的代碼循環往復。可能有辦法以有限的方式完成循環展開,但編譯器可能比簡單的for(int i=0; i < 5; ++i)
循環更難以確定循環。
如果函數以特殊方式編碼,編譯器還可以使用tail call。雖然它不會在調用時逐字節重複裝配,但它可以避免設置堆棧幀並將其替換爲jmp
指令,從而使函數調用所需的開銷不低於if
聲明。
相關問題
- 1. 如果我們將遞歸函數作爲內聯函數會發生什麼?
- 2. 將內聯函數作爲C中的參數傳遞時會發生什麼?
- 3. 虛函數內聯函數會發生什麼情況?
- 4. 函數遞歸,SAS中會發生什麼?
- 5. 遞歸內聯函數
- 6. 爲什麼如果我添加lambda左遞歸發生?
- 7. 將非關聯數組傳遞給json_encode()會發生什麼?
- 8. 有什麼方法可以內聯遞歸函數嗎?
- 9. 爲什麼我會發生遞歸錯誤?
- 10. 如果我遞歸調用ajax函數會發生什麼?它可能會導致任何問題。
- 11. 如果重新定義內聯函數會怎樣?
- 12. 當函數重新定義時,原型會發生什麼?
- 13. 如果函數內引用了一個變量,那麼會發生什麼
- 14. 遞歸函數溢出,爲什麼?
- 15. 這個遞歸函數讓我困惑,發生了什麼?
- 16. 如果shared_ptr的構造函數失敗會發生什麼?
- 17. 如果函數不返回,執行堆棧會發生什麼?
- 18. 如果我在OnPaint()函數中使用CClientDC會發生什麼?
- 19. 以下遞歸函數的非遞歸函數是什麼?
- 20. 將JavaScript函數作爲變量關閉時會發生什麼?
- 21. 爲什麼我的Perl遞歸函數永遠不會結束?
- 22. 爲什麼下面的函數不會產生Clang的尾遞歸?
- 23. 如果我們使用:操作符在函數內定義一個屬性會發生什麼?
- 24. 如果構造函數拋出`new`分配的內存會發生什麼?
- 25. 如果您將頻道閱讀爲空,會發生什麼?
- 26. 爲什麼不是這個F#內函數尾遞歸?
- 27. 當我們在函數內部傳遞參數時會發生什麼?
- 28. 如果您將int傳遞給C中的字節參數,會發生什麼?
- 29. 空內聯函數到底發生了什麼?
- 30. Dropbox API - 如果沒有互聯網連接會發生什麼
有趣的問題...... –
也與此有關。http://stackoverflow.com/questions/34125/which-if-any-c-compilers-do-tail-recursion-optimization –