严格的指针别名:是通过'volatile'指针/引用访问解决方案吗?

dou*_*lep 8 c++ volatile strict-aliasing type-punning

一个特定的问题,一个自我回答和评论之后,我想了解它是否是一个正确的解决方案,解决方法/黑客或者只是完全错误.

具体来说,我重写了代码:

T x = ...;
if (*reinterpret_cast <int*> (&x) == 0)
  ...
Run Code Online (Sandbox Code Playgroud)

如:

T x = ...;
if (*reinterpret_cast <volatile int*> (&x) == 0)
  ...
Run Code Online (Sandbox Code Playgroud)

volatile指针的限定符.

让我们假设在我的情况下对待Tint有道理的.这是通过volatile引用解决指针别名问题吗?

供参考,来自规格:

[注意:volatile是对实现的暗示,以避免涉及对象的激进优化,因为对象的值可能会被实现无法检测到的方式更改.有关详细语义,请参见1.9.一般来说,volatile的语义在C++中与在C中的相同. - 最后的注释]

编辑:

上面的代码确实至少在GCC 4.5上解决了我的问题.

sel*_*tze 16

易失性无法帮助您避免未定义的行为.所以,如果GCC对你有用,那就好了.

我们假设T是POD.然后,正确的方法是

T x = …;
int i;
memcpy(&i,&x,sizeof i);
if (i==0)
  …
Run Code Online (Sandbox Code Playgroud)

那里!没有严格的别名问题和没有内存对齐问题.GCC甚至将memcpy作为内部函数处理(在这种情况下不插入函数调用).

  • C++标准,第3.10节第15段是您需要查看的关于严格别名的地方.没有提到涉及volatile的异常. (6认同)
  • @Johannes:我并不是故意暗示它总是未定义的行为.我只是想说,挥发性不会对3.10/15产生任何影响. (3认同)