【发布时间】:2010-06-05 19:50:14
【问题描述】:
在 a specific problem 之后,我想知道它是一个正确的解决方案、解决方法/hack 还是完全错误。
具体来说,我重写了代码:
T x = ...;
if (*reinterpret_cast <int*> (&x) == 0)
...
作为:
T x = ...;
if (*reinterpret_cast <volatile int*> (&x) == 0)
...
使用volatile 限定符指向指针。
让我们假设在我的情况下将T 视为int 是有道理的。通过volatile 引用访问是否解决了指针别名问题?
供参考,来自规范:
[ 注意:volatile 是对实现的提示,以避免激进 涉及对象的优化,因为对象的值可能 通过实现无法检测到的方式进行更改。见 1.9 详细的语义。通常,volatile 的语义旨在 在 C++ 中与在 C 中相同。 — 尾注 ]
编辑:
以上代码至少在 GCC 4.5 上确实解决了我的问题。
【问题讨论】:
-
这个问题不是显然是 C++ 特定的。 C++ 风格的转换可以用 C 轻松重写。
-
@curiousguy 但是 C 和 C++ 有不同的语言规则
-
@MattMcNabb WRT
volatile有何不同?
标签: c++ volatile strict-aliasing type-punning