什么时候编译器可以优化破坏我的C++代码?

gab*_*lin 9 c++ optimization

什么时候编译器可以进行优化会导致我的C++代码表现出错误的行为,如果没有执行这些优化,那么这些行为将不会出现?例如,volatile在某些情况下不使用会导致程序行为不正确(例如,不从内存重新读取变量的值,而只读取一次并将其存储在寄存器中).但是,在开启最具侵略性的优化标志之前,还有其他陷阱应该知道吗,然后想知道为什么程序不再起作用了?

Ash*_*ain 17

编译器优化不应该影响程序的可观察行为,因此理论上,您不必担心.在实践中,如果在不确定的行为程序流浪狗,什么事情都可能已经发生,因此,如果你的程序中断时启用优化,你只是暴露现有错误的-这是不优化,打破它.

一个常见的优化点是返回值优化(RVO)和命名返回值优化(NRVO),它基本上意味着函数的值返回的对象直接在接收它们的对象中构造,而不是复制.这会调整构造函数,复制构造函数和析构函数调用的顺序和数量 - 但通常在正确编写这些函数的情况下,行为中仍然没有可观察到的差异.


Ste*_*end 5

除了你提到的情况,时间可以在多线程代码中改变,这样看起来不再有效.局部变量的放置可以变化,使得诸如内存缓冲区溢出之类的有害行为在调试中发生但不是释放,优化或非优化,反之亦然.但所有这些都是已经存在的错误,只是由编译器选项更改暴露出来.

这假设编译器在其优化器中没有错误.