【发布时间】:2017-04-14 14:06:35
【问题描述】:
对于上面的例子,我试图弄清楚增量方法是否真的会被内联。如果在我定义 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
【问题讨论】:
-
是的,预处理器首先运行,然后是编译器。但是即使你没有使用预处理器实现断言,常量折叠几乎总是在内联决策之前发生,所以这个死代码仍然会被删除,如果合适的话,函数会被内联。一般来说,相信你的编译器会做出内联决定。如此简单的代码绝不是您需要浪费大量时间担心的事情。
标签: c++ compilation conditional-compilation