在发布版本中是否会删除"if ... ASSERT"?

sas*_*alm 3 c++ mfc assert

有时候我会写代码

if (ptr)
    ASSERT(ptr->member);
Run Code Online (Sandbox Code Playgroud)

代替

ASSERT(!ptr || ptr->member);
Run Code Online (Sandbox Code Playgroud)

因为它更直接的IMO.冗余比较是否会保留在发布版本中?

Fré*_*idi 6

我会说这取决于你的编译器.

在发布模式下,ASSERT宏将不会计算ptr->member并将解析为编译器将优化的普通表达式,但if语句和关联的比较将保持不变.

但是,如果编译器足够智能以确定条件没有任何副作用,则可能会优化整个if语句.编译到汇编(使用/ FA选项)会给你一个明确的答案.

  • @ jbat100,它取决于条件表达式.从提问者的例子开始,`ptr`可能是一个类的实例,它用一个具有副作用的函数覆盖`operator bool()`.如果是这种情况,则不能省略条件表达式,因为程序的行为会发生变化. (2认同)