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指针的限定符.
让我们假设在我的情况下对待T是int有道理的.这是通过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作为内部函数处理(在这种情况下不插入函数调用).
| 归档时间: |
|
| 查看次数: |
1354 次 |
| 最近记录: |