gpt4 book ai didi

c++ - 算术运算和编译器优化

转载 作者:太空狗 更新时间:2023-10-29 23:07:26 24 4
gpt4 key购买 nike

我正在考虑一个定点算术库,为了决定库本身应该完成多少优化(通过表达式模板),我开始质疑优化器已经完成了多少。以下面的例子为例:

//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_)

尽管当您考虑整数溢出时,此转换不会导致相同的行为。我的库的用户可能会关心数学等价性并且宁愿使用简化版本(可能通过表达式模板提供)。

现在的问题是:优化器是否敢自己进行优化,即使行为并不完全相同?我应该为这样的优化而烦恼吗?请注意,此类优化并非微不足道。实际上,如果您确实进行了这些优化,则在使用定点运算时很少需要进行任何位移。

最佳答案

这将取决于 a_b_ 类型是有符号的还是无符号的。

在 C 和 C++ 中,有符号溢出在技术上是未定义的行为,而无符号溢出是使用两个补码算法完成的。

然而,一些编译器拒绝优化该代码,因为许多程序依赖于带符号溢出的二补行为。

优秀的现代编译器将有一个选项来启用/禁用这个特定的假设:有符号整数不会溢出。默认选项因编译器而异。

例如,对于 GCC,请参阅选项 -fstrict-overflow/-fno-strict-overflow 和相关警告 -Wstrict-overflow

关于c++ - 算术运算和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com