2016-11-30 54 views
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 
+1

['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) )。 –

+1

是的,預編譯器在編譯器之前先運行。但即使你沒有使用預處理器實現斷言,常量摺疊幾乎總是在進行內聯決策之前發生,所以這個死代碼將會被刪除,並且該函數將在適當的時候被內聯。一般來說,請相信您的編譯器進行內聯決策。編寫這個簡單的代碼永遠不會浪費你很多時間。 –

回答

3

assert是一個宏,所以它是由預處理器編譯器看到任何結果代碼的前處理。