1
對於上面的例子,我試圖找出增量方法是否實際上是內聯的。如果在定義NDEBUG標誌時斷言將被編譯器刪除,則增量方法將成爲單行,因此實際內聯的概率將增加。 所以問題歸結爲移除斷言並由編譯器做出內聯決定的順序。定義NDEBUG時刪除斷言是否發生在函數內聯之前?
#ifndef Example_h__
#define Example_h__
#include <cassert>
class A
{
private:
int m_value = 0;
public:
void increment();
};
inline void A::increment()
{
++m_value;
assert(m_value < 100);
}
int main()
{
A a;
a.increment();
}
#endif
['assert'](http://en.cppreference.com/w/cpp/error/assert)是一個*宏*,所以它被預處理器處理,這是在[階段4](http:///en.cppreference.com/w/cpp/language/translation_phases#Phase_4)在實際編譯之前(在[階段7]中(http://en.cppreference.com/w/cpp/language/translation_phases#Phase_7) )。 –
是的,預編譯器在編譯器之前先運行。但即使你沒有使用預處理器實現斷言,常量摺疊幾乎總是在進行內聯決策之前發生,所以這個死代碼將會被刪除,並且該函數將在適當的時候被內聯。一般來說,請相信您的編譯器進行內聯決策。編寫這個簡單的代碼永遠不會浪費你很多時間。 –