如何編譯計算哪些功能應該是內聯,因爲內嵌的要求是不是強制性的?我應該製作什麼類型的函數?的標準是什麼是內聯
額外的問題。我可以進行內聯電話嗎?
void func{} // normal (not-inline) function
int main()
{
func(); // normal call
// inline func(); // inline call
return 0;
}
如何編譯計算哪些功能應該是內聯,因爲內嵌的要求是不是強制性的?我應該製作什麼類型的函數?的標準是什麼是內聯
額外的問題。我可以進行內聯電話嗎?
void func{} // normal (not-inline) function
int main()
{
func(); // normal call
// inline func(); // inline call
return 0;
}
如何編譯計算哪些功能應該是內聯,因爲內嵌的要求是不是強制性的?
(從wiki)在C和C++編程語言的各種版本,內聯函數是在其上的編譯器已經請求執行內聯擴展的功能。換句話說,程序員已經要求編譯器在函數被調用的每個地方插入函數的完整主體,而不是生成代碼來在定義的地方調用函數。編譯器沒有義務尊重這個請求。
在C++中,你可以使用__forceinline
關鍵字允許程序員強制編譯器內聯函數,但亂用__forceinline
可能產生更大的代碼(臃腫的可執行文件),很少或沒有性能增益,而且在某些情況下,甚至是性能上的損失。
我應該什麼樣的內聯函數?
小功能。在頭文件中定義小(如在一行)函數是一個好主意,因爲它爲編譯器提供了更多的信息來處理優化代碼。這也增加了編譯時間。
檢查的詳細信息了When should I write the keyword 'inline' for a function/method?。
我可以進行在線通話?
inline
可以在函數聲明只使用,不打電話。您只需將預定義的內聯函數作爲普通函數調用即可。當您將函數標記爲inline
時,建議編譯器將此函數內聯。在(好的)編譯器上,這既不能保證它會,也不能保證它不會。
所有的內聯函數的作用是與代碼的身體代替調用該函數。所以,雖然你不能建議編譯器應該在哪裏內聯函數,但你顯然可以實際上粘貼代碼(或者使用宏來確保代碼保持不變)。但是你需要一個非常好/奇怪的理由來做到這一點。
一般情況下,小標記功能內嵌如果你願意,但除此之外,它留給編譯器。
什麼inline
確實是建議編譯器用函數的實際代碼替換對此函數的任何調用,正如T. Kiley前一段時間所說。編譯器不有要做到這一點,但如果這樣做,這是發生了什麼:
如果你有這樣的功能:
inline int addtwo(int i)
{
return i+2;
}
編譯器將取代所有之類的語句
cout<<addtwo(x)<<endl;
與
cout<<(x+2)<<endl;
如果您的功能比幾行更長,則完成的可執行文件大小會增加,因爲每次調用都將被函數的整個代碼替換。 (還有什麼其他缺點?)
inline
適用於平凡短的函數(1行)。
這是不正確的。 'inline' does not *告訴編譯器對所有調用都這樣做,正如問題所述,還有一些其他答案也表示。 –
我編輯了這篇文章,以清楚地表明編譯器不必這樣做 - 是什麼錯了? – professorfish
只需檢查您的編譯器的文檔(語法和適用性)。它會告訴你它什麼時候會內聯函數調用。順便說一句,註釋行中的語法無效。一般來說,內聯一個小/快函數是一件好事:如果函數需要1秒執行,然後爲函數調用保存10 ns,那就沒用了。 –
@Adriano謝謝我知道這就是爲什麼我已經評論過它) – Ivars
'inline'關鍵字只是編譯器的**提示**,不多也不少。其餘的都是編譯器實現特定的。 –