在特定问题、自我回答和评论之后,我想了解它是否是正确的解决方案、解决方法/黑客或完全错误。
具体来说,我重写了代码:
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 上确实解决了我的问题。