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

如果我有这个代码:
class A { ... };
class B { ... };

void dummy()
{
    A a(...);
    B b(...);
    ...
}
我知道变量
a
b
将以反向分配顺序销毁(
b
将首先销毁,然后
a
);但我可以确定优化器永远不会交换
a
b
的分配和构造吗?或者我必须使用
volatile
来执行它?     
已邀请:
唯一的保证是,构造
a
的任何可观察的副作用(即对
volatile
对象的读写和对I / O函数的调用)都将在构造
b
的任何可观察的副作用之前发生,并且任何副作用
b
要求的
a
将在需要之前发生。 很难想象为什么你需要比这更严格的顺序,但是使对象
volatile
将确保在初始化
b
的任何部分之前完全初始化although1ѭ,尽管构造函数中的某些代码仍然可以在
a
完成之前发生。     
你唯一可以肯定的是
a
的构造和分配将在
b
之前。只要您将语句与
;
分开,无论优化如何,它们都将按顺序执行。
volatile
不会改变它,它的作用是阻止编译器在访问之间缓存值。     
好吧,我在标准中找到了这样的陈述,但我对其他人的答案感到有些困惑。   呼叫中的每个评估   功能(包括其他功能   (除非另有说明)   特别是在之前或之后测序   执行机构的   被称为函数是不确定的   按顺序排序   执行被调用的函数。 (换句话说,函数执行不会相互交错。) 它只能确保函数调用不相互交错,但函数是不确定的顺序,这意味着,   评估A和B是   不确定地排序   A在B或B之前排序   在A之前排序,但确实如此   未指明哪个。     

要回复问题请先登录注册