2016-11-30 57 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是一个宏,所以它是由预处理器编译器看到任何结果代码的前处理。