有时我会编写像
这样的代码if (ptr)
ASSERT(ptr->member);
而不是
ASSERT(!ptr || ptr->member);
因为它更直接的IMO。冗余比较是否会保留在发布版本中?
答案 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
}