0

如果我在 for 循环中有一个对于循环的所有迭代都相同的方法调用 - 编译器是否足够聪明来优化它?

 for (int j = 0; j < 24; j++ ) {
        *destinationPointer++ = identityArray[j] * (1 / powf(2, valueFromAboveInMethod));
 }     

还是我应该明确并在循环之前将其分配给一个值?

 float value = 1 / powf(2, valueFromAboveInMethod);

 // populate the array
 for (int j = 0; j < 24; j++ ) {
        *destinationPointer++ = identityArray[j] * value;
 }     

如果编译器在这里做了一些很棒的事情并且我不必为浮点数使用 4 个字节,我会更高兴——这是在递归方法中。

4

3 回答 3

2

我个人会在这里使用一个变量。不仅因为它可以提供更好的代码,还因为它向任何阅读代码的人表明值不会改变[但是我会给它一个比“值”更好的变量名]。我确实希望编译器实际预先计算该值,但正如已经提到的,它确实依赖于编译器对powf纯函数的理解(没有副作用并且每次对相同的输入给出相同的结果)。

在递归调用中使用额外变量而导致的任何额外存储要么是“好吧,没关系”,要么是“你正在玩非常接近堆栈溢出深渊的边缘”。堆栈溢出可能是最严重的崩溃类型之一,因为它绝对没有提供任何警告或恢复方法,因为程序需要使用堆栈来恢复,而且它很可能是唯一可用的堆栈溢出......如果你递归函数要么是无限的,要么你不能保证递归调用的数量在堆栈的限制范围内,那么我建议你应该重新设计这个函数。深度递归通常是非常低效的,而且它'

-- 垫子

于 2013-03-20T20:07:54.413 回答
1

这取决于你用什么选项编译它。通常,即使启用了最小优化,编译器也会处理这种简单的优化,但是最好像您在第二个代码中编写的那样自己做。无论如何,如果编译器会优化它,它也会保留additional 4 bytes,因为值需要存储在任何地方。

于 2013-03-20T19:48:40.030 回答
0

编译器可能不够聪明,无法实现 powf 是无状态的。

如有疑问,请编译为汇编程序并自行检查。

于 2013-03-20T19:58:51.043 回答