【问题标题】:Does removal of asserts when NDEBUG is defined happen before inlining of functions?定义 NDEBUG 时删除断言是否在内联函数之前发生?
【发布时间】: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

【问题讨论】:

  • assert 是一个 macro 因此它由发生在 phase 4 的预处理器处理,这发生在实际编译之前(在 phase 7 中)。
  • 是的,预处理器首先运行,然后是编译器。但是即使你没有使用预处理器实现断言,常量折叠几乎总是在内联决策之前发生,所以这个死代码仍然会被删除,如果合适的话,函数会被内联。一般来说,相信你的编译器会做出内联决定。如此简单的代码绝不是您需要浪费大量时间担心的事情。

标签: c++ compilation conditional-compilation


【解决方案1】:

assert 是一个宏,因此它在编译器看到任何结果代码之前由预处理器处理。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多