像这个问题中的一样: 假设我有一小段代码,像这样:
#include <iostream>
using namespace std;
struct foo {
int a;
foo() : a(12) {};
};
int
main()
{
volatile foo x;
return 0;
}
使用g++ -g -O2
编译后,发现x
的初始化被优化掉了。
然而这个:
#include <iostream>
using namespace std;
struct foo {
volatile int a;
foo() : a(12) {};
};
int
main()
{
volatile foo x;
return 0;
}
调用构造函数。
如果我尝试在代码中使用变量(例如
cout<< foo.a << endl;
),则汇编输出在两种情况下是相等的。我的理解是否正确?
第一种情况下,根本没有访问该结构体,因此它被完全优化掉了。
在第二种情况下,结构体的字段被指定为在构建期间也可能更改,因此无论如何都会调用foo()。
补充:
我已经尝试过上述代码的调整:像
while(foo.a--);
这样的调用按预期方式工作,它实际上发生了而不是在优化期间被删除/替换为结果,因此似乎volatile实际上被继承了,然而构造函数的行为却表现出这种奇怪的(或者至少是一开始意外的)方式。编辑2:
我已经用clang和MSVC进行了检查,它们的行为与gcc相同。
volatile T
类型的对象,该对象的子对象..." 因此,在两个示例中,foo.a
是一个volatile
对象,对它的操作是可观察的副作用,不应被优化掉。 - Igor Tandetnikfoo
的构造函数而不必单独为作为volatile实例化的foo
情况进行优化)。 - M.M