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变量有关的不一致行为.
memset((void*)&c,34, 1);有未定义的行为(第7.1.6.1/6节).因此允许编译器产生任何结果.
如果尝试通过使用具有非volatile限定类型的glvalue来引用使用volatile限定类型定义的对象,则程序行为是未定义的.
请不要使用那样的演员表,更不要使用C风格的演员阵容.当一个人不知道在某种情况下正确的C++演员是什么时,很可能是一个人不应该投出任何东西的情况.
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |