使用不纯的表达式来优化空函数吗?

时间:2014-02-24 15:57:44

标签: c++ optimization c++11 macros assert

// Example assert function
inline void assertImpl(bool mExpr, const std::string& mMsg) {
    if(!mExpr) { printMsg(mMsg); abortExecution(); }
}

// Wrapper macro
#ifdef NDEBUG
    #define MY_ASSERT(...) do{ ; }while(false)
#else
    #define MY_ASSERT(...) assertImpl(__VA_ARGS__)
#endif

考虑mExprmMsg不是纯粹表达式的情况 - 有没有办法迫使编译器优化它们?

bool globalState{false};
bool pureExpression() { return false; }
bool impureExpression() { globalState = !globalState; return false; }

// ...

// This will very likely be optimized out with (NDEBUG == 0)
MY_ASSERT(pureExpression());

// Will this be optimized out with (NDEBUG == 0)
MY_ASSERT(impureExpression());
  • 编译器通常会在不合理的表达被“丢弃”的情况下做什么?
  • 有没有办法让100%确定纯表达式得到优化?
  • 有没有办法让100%确定不纯的表达式得到优化或永远不会被优化?

2 个答案:

答案 0 :(得分:4)

宏扩展后,您对impureExpression()的调用不再存在:它不是宏扩展结果的一部分。如果不存在对函数的调用,则只要定义NDEBUG,就不会在所有符合要求的实现上,在任何优化级别调用该函数。

注意:您谈论的是NDEBUG == 0,但如果这是您想要的条件,则#ifdef NDEBUG条件不正确。 #ifdef测试宏是否已定义,并且不关注定义是什么。

答案 1 :(得分:0)

此处不涉及优化程序。在使用NDEBUG启用的宏中,无论如何都会丢弃参数。