涉及优化器的局部变量构造和破坏

Log*_*orn 5 c++ optimization allocation volatile destruction

如果我有这个代码:

class A { ... };
class B { ... };

void dummy()
{
    A a(...);
    B b(...);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道,变量ab将在反向分配顺序(被破坏b将首先被破坏,则a); 但我可以肯定的是,优化器将永不掉的分配和建设ab?或者我必须volatile用来执行它?

Mik*_*our 6

唯一的保证是任何可观察到的副作用(即,读取和写入volatile的建设的目标和要求,以I/O功能)a之前建设的任何可观察到的副作用会发生b,以及任何副作用a需要通过b意志在他们需要之前发生.

很难想象为什么你需要比这更严格的排序,但是在初始化任何部分之前使对象volatile确保a完全初始化b,尽管构造函数中的一些代码在a完成之前仍然可能发生.

  • @AlessandroV:锁定互斥锁将强加内存屏障,为您提供所需的顺序.这超出了当前C++标准的范围,但任何实现可用互斥锁的库都将确保这种情况. (5认同)