簡體   English   中英

函數在 C++ 中內聯的要求

[英]requirement for a function to be inline in c++

函數的要求是什么,以便它可以在 C++ 中內聯執行? 是否存在函數不能內聯的情況? 或者任何函數都可以內聯,程序員有責任根據運行時和編譯時的考慮來決定如何定義函數?

這取決於你的意思。 如果您的意思是,什么時候可以內聯擴展函數,刪除函數調用,那么這真的取決於編譯器。 它幾乎可以內聯任何函數,並且拒絕內聯您要求它執行的幾乎任何函數。 可能不會被內聯的函數包括遞歸函數,以及函數地址所在的函數。 總的來說,最好不要考慮這么多。

inline關鍵字的主要用途不是請求內聯,而是指示該函數可以在多個翻譯單元中#included 而不會導致多個定義錯誤。

函數的要求是什么,以便它可以在 C++ 中內聯執行? 是否存在函數不能內聯的情況?

內聯函數只是將函數調用替換為實際代碼的函數。 如果你按照這個定義,你可以手動復制和粘貼代碼,它會是“內聯”的。 然而,這可能並不總是一個好主意:這是速度與程序大小的問題。 隨着函數變得越來越大,讓它們內聯的好處會減少。

或者任何函數都可以內聯,程序員有責任根據運行時和編譯時的考慮來決定如何定義函數?

通常,當您使用inline關鍵字時,它只是一個請求,編譯器會選擇是否實際進行內聯函數調用。 許多編譯器還提供了一種強制內聯函數的方法(例如,MSVC 具有__forceinline關鍵字)——在這種情況下,編譯器不會嘗試變得聰明,因此由您來權衡使函數內聯。

函數的要求是什么,以便它可以在 C++ 中內聯執行?

它需要在調用它的每個位置進行定義(通常這是通過將它放在.h來完成的)。

是否存在函數不能內聯的情況?

我相信不是在語言標准方面,盡管當然每個編譯器都可以並且將會實現自己的一些限制。

或者任何函數都可以內聯,程序員有責任根據運行時和編譯時的考慮來決定如何定義函數?

inline關鍵字只是程序員對編譯器的一個提示,即程序員真的希望這個函數被內聯(大概程序員已經發現大量的調用開銷,在“熱”循環中調用一個小函數,如分析器所示 - - 或者,該函數非常小,以至於它與調用代碼一樣小;-) -- 或者,內聯函數允許“跨函數邊界進行優化”,這是特定編譯器無法發現或無法執行的——等等)。

編譯器可以自由地忽略提示,就像可以自由地忽略變量存儲類的舊register提示一樣(我相信現在大多數優化的 C++ 編譯器確實忽略register但很少忽略inline )——IOW,編譯器可以自由地內聯所有或對函數的一些調用,無論該函數是否聲明為inline

(當然,當它們通過指向隱藏在某些點並在其他點使用的函數的顯式指針完成時,或者當函數的地址作為參數傳遞給其他函數時,它不會“內聯調用” -但這可能會影響特定調用的內聯,而不一定是對同一函數的其他調用以不同方式執行)。

“以防萬一”你的編譯器非常認真地接受你的inline提示,通常值得測量有和沒有inline代碼大小和速度(除非你的編譯器為此提供了一個選項/標志,只是一個#define inline肯定會“禁用” inline的影響,從而允許這樣的測量)。 但是,如果您要跨多個編譯器部署代碼,尤其是。 對於多個體系結構,請注意,鑒於編譯器優化策略CPU 體系結構的差異,對一個平台的積極影響最終可能會適得其反。

內聯函數取決於代碼的長度和代碼的復雜性……:) 內聯函數只是對編譯器的一個請求……

或者任何函數都可以內聯,程序員有責任根據運行時和編譯時的考慮來決定如何定義函數?

編譯器根據某些條件將該函數用作內聯函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM