优化编译器是否会删除对结果将乘以零的方法的调用?

Tim*_* R. 5 optimization

假设你有一个计算成本高的方法,Compute(p)它返回一些浮点数,另一个方法Falloff(p),它将另一个浮点数从零返回到1.

如果你计算Falloff(p) * Compute(p),返回零时Compute(p)仍会运行Falloff(p)?或者您是否需要编写一个特殊情况来防止Compute(p)不必要地运行?

从理论上讲,优化编译器可以确定在Falloff返回零时省略Compute对程序没有影响.但是,这有点难以测试,因为如果你有Compute输出一些调试数据来确定它是否正在运行,编译器会因为调试信息而知道不要省略它,导致一种薛定谔猫的情况.

我知道这个问题的安全解决方案只是添加特殊情况,但我只是好奇.

Gab*_*abe 6

一般来说,编译器会知道函数调用可能会产生副作用(无限循环,异常等),并且不会对其进行优化.另一方面,存在诸如整个程序优化器之类的东西,其可以确定函数没有副作用并且因此在不使用其返回值时省略它.

请注意,如果您的函数返回IEEE float并且它乘以0,除非您可以确定它始终返回实数,否则无法安全地省略函数调用.如果它可以返回一个InfNaN,则乘以0不是一个nop并且必须执行.