C++编译器能否消除非读取的易失性本地Var

Jav*_*Man 4 c++ volatile intrinsics visual-c++ c++11

说,我有这个代码:

int f() {
  volatile int c;
  c=34;
  return abc();
}
Run Code Online (Sandbox Code Playgroud)

挥发性诠释三是从来不看.但它被标记为易失性,编译器可以完全消除它吗?我在Visual C++ 2010中的测试显示了相互矛盾的结果.在VC++中,如果我启用优化(最大化速度),上面的函数包含一个名为c的局部变量(通过查看生成的程序集列表).但是,我还尝试通过编译器内部函数(如memset()初始化变量而不是使用赋值运算符)(并使用编译器内部函数启用),该变量被消除.

int f() {
  volatile int c;
  memset((void*)&c,34, 1); 
  return abc();
}
Run Code Online (Sandbox Code Playgroud)

那么根据C++标准,编译器可以消除volatile int c吗?我想可能VC++中存在一些与内部函数如何优化volatile变量有关的不一致行为.

R. *_*des 7

memset((void*)&c,34, 1);有未定义的行为(第7.1.6.1/6节).因此允许编译器产生任何结果.

如果尝试通过使用具有非volatile限定类型的glvalue来引用使用volatile限定类型定义的对象,则程序行为是未定义的.

请不要使用那样的演员表,更不要使用C风格的演员阵容.当一个人不知道在某种情况下正确的C++演员是什么时,很可能是一个人不应该投出任何东西的情况.