为什么编译器无法优化这两个语句呢?

时间:2010-09-27 03:20:56

标签: c++ visual-c++ compiler-optimization

有没有理由说编译器无法在main中优化以下2个语句,即使我在Visual C ++中启用了完全优化?在内存中访问int变量的任何副作用?

int _tmain(int argc, _TCHAR* argv[])
{
    volatile int pleaseOptimizeMeOut = 100;

    (pleaseOptimizeMeOut);

    return 0;
}

4 个答案:

答案 0 :(得分:16)

它无法优化它们,因为您已将变量声明为volatile。对volatile限定对象的加载和存储是C抽象机器的“外部可见”效果的一部分。

(顺便说一下,当访问内存中的变量时,会有大量副作用;它可以更新包括TLB在内的硬件内存缓存,也可能导致页面错误。以及你的进程内存正在执行的可能正在被另一个进程窥探,比如调试器。

答案 1 :(得分:8)

volatile明确告诉编译器不要对该变量进行优化。

答案 2 :(得分:5)

在某些计算机上,设备I / O被建模为内存读/写。这就是当正确使用volatile时的情况......它告诉编译器明确地不要假设变量操作不重要或者可以优化....

答案 3 :(得分:4)

其他答案强调volatile在这里的重要性,我没有任何补充。但是,我想说这样的构造存在多么重要,因为 是有用的。根据我的硬件设计经验,硬件中CPU和逻辑块之间的接口很多时候都基于内存写入和读取。这意味着当CPU从HW读取一些寄存器时,会发生一些事情(即中断清除,队列前进以及许多其他选项)。

现在,一旦你执行了对pleaseOptimizeMeOut的访问,因为它是volatile,编译器只是假设你可能只是因为副作用而做了,所以它会是绝对错误的优化它。假设变量映射到HW队列,并且您只想在不实际从中获取值的情况下推进队列。

也就是说,在读取时将变量映射到寄存器有副作用是恕我直言并不是一个好习惯,最好用函数调用封装它,正是因为你的问题证明 - 在某些情况下它会让人感到困惑。 / p>

将变量映射到没有副作用的寄存器 非常有用且广泛使用。