是否由编译器优化了整数除法?

时间:2011-03-17 14:52:43

标签: c++ optimization division

首先,我觉得我必须为自己辩护。我知道我可能不应该担心这种事情,过早优化和什么不是。我知道。我问这个纯粹是因为我很好奇,不能(或不知道如何)自己找到解决方案。

编译器通常的做法是优化常数整数除法吗?像这样:

const int FOUR = 4;
const int TWO = 2;
int result = FOUR / TWO;

优化为:

const int FOUR = 4;
const int TWO = 2;
int result = 2;

编辑:我非常清楚答案因编译器和编译器的不同而有所不同,如果是常见的做法,我会非常好奇。

8 个答案:

答案 0 :(得分:6)

是的,这实际上是普遍的做法,事实上如果你的编译器没有这样做,你确实有一个非常不寻常的编译器。

答案 1 :(得分:4)

除了常见之外,语言几乎都需要它。如果声明结果const,它是一个整型常量表达式,可用于数组维度等内容。所以编译器必须知道数值。这是一个“优化”,即使在关闭优化的构建中也会发生。

答案 2 :(得分:3)

是的,打开优化时很常见,但这取决于编译器。 Visual C ++ 9就是这样做的。

如果你真的在乎你应该检查发射的组件 - 这是唯一可靠的方法。

答案 3 :(得分:2)

我要补充一点,虽然对于整数来说可以做“常量折叠”,但浮点数可能会有问题,所以并不总是为它们做/用它们。

例如

  

http://www.nullstone.com/htmls/category/consfold.htm

     

有些环境支持多种环境   可以的浮点舍入模式   在运行时动态更改。在   这些环境,表达方式等   as(1.0 / 3.0)必须在   运行时如果舍入模式不是   在编译时已知。

答案 4 :(得分:2)

是的,但请考虑:

void f(int x)
{
    return x*3/4
}

操作顺序意味着编译器不会减少3/4

答案 5 :(得分:1)

我编译和调试的代码与你的代码非常相似,根据我的经验,我会说是的。但是,这可能会改变编译器到编译器(我主要使用MSC8-MSC10)。

答案 6 :(得分:1)

这在编译器中被称为“常量折叠”,在现代编译器中很常见。它不仅仅是可以优化的分工;许多类型的常量表达式可以简化为单个编译时常量。

答案 7 :(得分:1)

虽然对于任何流行的编译器,答案都是“是”,但我建议您在调试器中检查代码的反汇编以自行验证。然后,您可以学习将来可以应用于其他问题的技能。