代码之家  ›  专栏  ›  技术社区  ›  Thomson

为什么编译器不能优化这两个语句?

  •  5
  • Thomson  · 技术社区  · 14 年前

    是否有任何理由编译器无法优化以下2个语句在主,即使我打开了完全优化Visual C++?访问内存中的int变量有什么副作用吗?

    int _tmain(int argc, _TCHAR* argv[])
    {
        volatile int pleaseOptimizeMeOut = 100;
    
        (pleaseOptimizeMeOut);
    
        return 0;
    }
    
    4 回复  |  直到 14 年前
        1
  •  16
  •   caf    14 年前

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

    大量 访问内存中的变量时的副作用;它可以更新硬件内存缓存,包括TLB,还可能导致页错误。进程正在执行的内存可能正被另一个进程(如调试器)窥探。

        2
  •  8
  •   Steve Townsend    14 年前

    volatile

        3
  •  5
  •   Tony Delroy    14 年前

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

        4
  •  4
  •   Eli Bendersky    14 年前

    其他答复强调了 volatile

    现在,一旦执行对 pleaseOptimizeMeOut 不稳定的 只是为了副作用 ,所以优化它是绝对错误的。假设变量被映射到一个HW队列,并且您只想推进队列而不实际从中获取值。

    也就是说,当读取有副作用时,将变量映射到寄存器并不是一个好的做法,最好用函数调用来封装它,这正是你的问题所证明的原因——在某些情况下,它会让人困惑。

    但是,它非常有用而且应用广泛。