gpt4 book ai didi

c++ - 空函数是否会被不纯的表达式优化掉?

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:49 25 4
gpt4 key购买 nike

// 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% 确定不纯的表达式被优化掉或永远不会被优化掉?

最佳答案

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

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

关于c++ - 空函数是否会被不纯的表达式优化掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com