![](/img/trans.png)
[英]C++ How to determine if function has capability for being inlined and actually was?
[英]How to guarantee that a function is inlined in C++
在C ++中,可以使用inline
關鍵字將函數定義為內inline
。 就像程序員要求編譯器在函數調用的每個位置插入函數的完整正文一樣。
但據我所知,編譯器沒有義務遵守此請求。 那么,有什么方法可以保證內聯函數嗎?
不。 實際上,內聯一個函數是一個完整的實現細節,許多函數不能內聯。 這使得不可能存在內聯強制機制。 即使提供諸如__forceinline
(VC ++)之類的關鍵字的編譯器在某些情況下也不會使用該限定符內聯函數。 該頁面還帶有關於濫用此限定符的非常恰當的警告。
在VC ++中使用__forceinline
在g ++中使用__attribute__((always_inline))
由於該標准未涵蓋此問題,因此取決於您使用的編譯器。 編譯器的文檔將告訴您是否存在強制內聯函數的功能以及如何使用它。 文檔還應該告訴您該功能的限制,例如非尾位置的遞歸調用。
如果使用的是Microsoft編譯器,則可以使用__forceinline,如此處所述: http : //msdn.microsoft.com/zh-cn/library/z8y1yy88%28v=vs.71%29.aspx
我不知道在g ++或其他編譯器中強制內聯的方法。
通過將函數的定義直接放在標頭的聲明中,可以最大程度地內聯函數。
class TheClass
{
public:
static void DoSomething () // declaration
{
// the function's code (definition) goes here
};
};
// in the same header..
void DoOtherThings () // declaration
{
// the function's code (definition) goes here
}
無論如何,即使您使用特定於編譯器的關鍵字進行內聯強制,也無法保證。
100%的保證是將您的函數轉換為C ++宏並使用該宏而不是引用該函數。 如果您的函數有多行,請在您要在“宏函數”中使用換行符的地方放置\\
(空格后加反斜杠)。
我無法想象有辦法做到這一點。 它主要取決於編譯器。 另一個解決方案是使用#define宏定義函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.