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

时间:2011-11-08 15:59:35

标签: c++ mfc assert

有时我会编写像

这样的代码
if (ptr)
    ASSERT(ptr->member);

而不是

ASSERT(!ptr || ptr->member);

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

3 个答案:

答案 0 :(得分:6)

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

在发布模式下,ASSERT宏不会评估ptr->member并将解析为编译器将优化的普通表达式,但if语句和相关的比较将保持原样。

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

答案 1 :(得分:2)

只要编译器不是傻瓜,是的,它会被修剪。

尝试在编译器中编写:

if (x);

它会给你一个警告,声明没有效果,就像我说的,如果它不是愚蠢的,它会删除代码。

如果您想确定,可以使用编译器编译它并查看程序集。

答案 2 :(得分:1)

LLVM在需要优化时(由用户)删除它:

int main(int argc, char **argv) {
  if (argc) {}
  return 0;
}

变为:

define i32 @main(i32 %argc, i8** nocapture %argv) nounwind readnone {
  ret i32 0
}