我正在考虑一个定点算术库,为了决定库本身(通过表达式模板)应该完成多少优化,我开始质疑优化器已经完成了多少。以下面的例子为例:
//This is a totally useless function to exemplify my point
void Compare(FixedPoint a, FixedPoint b) {
if(a/b>10) {
... do stuff
}
}
现在,在这个函数中,该类的典型实现FixedPoint
将导致
if( ( (a_<<N) / b_) > (10 <<N) ) {
... do stuff
}
其中N
是小数位数。该表达式在数学上可以转换为:
(a_ > 10*b_)
即使当您考虑整数溢出时,这种转换不会导致相同的行为。我的库的用户可能会关心数学等价性,并且宁愿使用简化版本(可能通过表达式模板提供)。
现在,问题是:优化器是否敢自己进行优化,即使行为并不严格相同?我应该为这样的优化而烦恼吗?请注意,此类优化并非微不足道。实际上,如果您确实进行了这些优化,那么当您使用定点算术时,您很少需要进行任何位移。