2011-03-01 18 views

回答

3

我試着瀏覽相關的SO問題,爲你找到一個明確的現有答案,但是唉...…

所以,keywoard inline(或成員函數是隱式地內聯通過在類定義中所定義)有兩個作用:

  • 保證,該函數可以在多個轉換單元,而不被限定違反一個定義規則,即在實踐中,沒有鏈接者抗議多個定義。對於此用途,所有功能的定義必須是inline,並且它們必須相同。

  • 它作爲一個模糊的提示給編譯器來內聯調用函數的機器代碼。一些呼叫可以內聯,有些不是。內聯的程度可能會有所不同,編譯器甚至可能會完全忽略這個提示(實際上,g ++傾向於按照提示去荒謬,也許程度不高,而Visual C++更喜歡忽略它)。

對於一個遞歸函數,如果一個如下編譯該函數的任何特定呼叫的提示,則該呼叫可以被擴展爲遞歸的一個或兩個或三個或任何水平。這是一件困難的事情,所以不要指望它。此外,編譯器’自己的內聯啓發式可能比你的直覺更好,因爲編譯器擁有的東西(它知道更多)更全局的觀點,因此,在總結:

請勿使用inline暗示效果,將其用於ODR保證。

你在哪裏重新’絕對確保你知道優於編譯器,並在您已通過的原則,如「測量第一」,並遵守「不這樣做過早優化」,你可以得到更多的通過編譯器特定的語言擴展或編譯指示可靠地控制內聯。

乾杯&心連心,

2

很顯然,這將無法重複的代碼循環往復。可能有辦法以有限的方式完成循環展開,但編譯器可能比簡單的for(int i=0; i < 5; ++i)循環更難以確定循環。

如果函數以特殊方式編碼,編譯器還可以使用tail call。雖然它不會在調用時逐字節重複裝配,但它可以避免設置堆棧幀並將其替換爲jmp指令,從而使函數調用所需的開銷不低於if聲明。

相關問題