CppCon称编译器将g优化为恒返回true?实测结果存疑
CppCon视频中代码优化表述的疑问
示例代码
bool f(int i) { return i + 1 > i; } bool g(int i) { if (i == INT_MAX) return false; else return f(i); }
背景与疑问
编译器会将f优化为始终返回true,原因是有符号整数溢出属于未定义行为(UB)。但某CppCon视频声称编译器会将g也优化为始终返回true——即便i == INT_MAX时不会触发UB。
我在Compiler Explorer使用x86-64 Clang 19.1.0、-O3编译得到如下汇编:
f(int): mov al, 1 ret g(int): cmp edi, 2147483647 setne al ret
可见g会正确检查i == INT_MAX,并未被优化为恒返回true。请问视频中的表述是否有误?
视频相关解释(翻译)
具体来说,这意味着当你调用
f时,整数溢出不会发生,所以i != INT_MAX。编译器会基于这个假设消除相关代码,因为i != INT_MAX,所以g里的第一个判断分支永远不会执行。
内容的提问来源于stack exchange,提问作者Viliam Holly
相关产品推荐
相关产品推荐

