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) )。 –
是的,预编译器在编译器之前先运行。但即使你没有使用预处理器实现断言,常量折叠几乎总是在进行内联决策之前发生,所以这个死代码将会被删除,并且该函数将在适当的时候被内联。一般来说,请相信您的编译器进行内联决策。编写这个简单的代码永远不会浪费你很多时间。 –