在与同事讨论之后,如果clang将两个部门优化为1,则我最终会测试到一个部门。
const float x = a / b; //x not used elsewhere
const float y = 1 / x;
如果const float y = b / a
仅用作临时步骤值,那么理论上的clang可以优化为x
吗?
这是一个简单测试用例的输入和输出:https://gist.github.com/Jiboo/d6e839084841d39e5ab6(在两个输出中,您可以看到它执行了两个分区,而不是优化)
这个相关的问题是我理解的背后,似乎只关注为什么没有使用特定的指令,而在我的情况下它是没有完成的优化:{{3 }}
谢谢, JB。
答案 0 :(得分:4)
不,铿锵不能那样做。
但首先,你为什么要使用浮动? float有六位数的精度,double有15位。除非你有充分的理由,你可以解释一下,使用double。
浮点运算中的 1 /(a / b)与b / a不同。编译器必须做的是第一种情况:在第二种情况下:
如果结果保证相同,编译器只能更改代码,如果编译器编写器无法生成结果相同的数学证明,则编译器无法更改代码。在第一种情况下有两个舍入操作,舍入不同的数字,因此不可能保证结果相同。
答案 1 :(得分:1)
编译器并不像数学家那样思考。如果您认为简化表达式在数学上是微不足道的,那么编译器还有许多其他需要考虑的事项。实际上,编译器很可能比程序员更聪明,并且对C标准也有更多了解。
这样的事情可能是通过优化编译器"思维":
a / b
但只在一个地方使用x
,所以我们不必在堆栈上分配该变量。我将其删除并使用CPU寄存器。1.0f
。1.0f
与另一个浮点变量分开所涉及的潜在浮点不准确性!因此,我不能将此表达式与b / a
交换,因为程序员似乎想要的浮点不准确性将会丢失。 等等。有很多考虑因素。你最终得到的机器代码很难提前预测。只要知道编译器遵循你的指示信。