由于有符号整数溢出是未定义的行为,我希望下面的三个函数编译为相同或相似的程序集。然而事实并非如此。 test2
与 test1
略有不同和 test3
使用两个 imul
其他示例不需要的说明。
int test1(int x)
{
return x * 5 / 2;
}
int test2(int x)
{
return x * 10 / 4;
}
int test3(int x)
{
return x * 50 / 20;
}
comparison on compiler explorer编译器不执行这种优化是否有原因?
最佳答案
这种优化是否正确取决于实现是否保证整数溢出的影响:
x*(m*a)/(m*b)
与 x*a/b
将违反此类保证。 gcc 编译器提供了支持强保证选项 #1 或不提供任何保证的选项,并且整数溢出破坏不使用结果的代码部分的可能性不仅仅是理论上的。因为选项 #3 对于从潜在不可信来源接收输入的程序来说是非常危险的,并且因为 gcc 不提供 #1 和 #3 之间的任何设置,所以许多程序,包括那些选项 #2 满足要求的程序,是使用
fwrapv
构建强制选项 #1 的标志。
关于c++ - 为什么乘以常数有符号整数分数没有优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62487615/