G++编译器是否会将(int c=(a/b)*b;)优化为int c=a从而破坏程序?
G++是否会优化整数除法后跟随的乘法操作?
结论先行:G++绝对不会把int c = (a/b)*b;优化成int c = a;,你的程序逻辑不会被破坏。
原因很简单:编译器的所有优化都必须保证语义等价——优化前后的代码在C++标准规则下的行为必须完全一致,而(a/b)*b和a的语义根本不一样:
- C++里整数除法是向零截断的,当
a不能被b整除时,(a/b)*b的结果是最接近a且是b整数倍的数(正数时向下取整,负数时向上取整),和a本身不相等。比如7/3=2,2*3=6≠7;-7/3=-2,-2*3=-4≠-7。 - 如果编译器擅自把
(a/b)*b替换成a,直接改变了程序的计算结果,这违反了C标准的要求,任何合规的编译器(包括G)都不会做这种错误优化。
实际编译时,G++可能会用更高效的指令实现(a/b)*b的逻辑(比如针对特定的b值用位运算),但最终计算结果一定和原表达式的语义完全一致,绝不会直接等同于a。你完全可以放心用这个表达式来实现取整到b的倍数的逻辑。
内容的提问来源于stack exchange,提问作者Dennis Orlando
相关产品推荐
相关产品推荐

