【发布时间】:2014-07-13 22:22:47
【问题描述】:
What is the strict aliasing rule? 的公认答案提到您可以使用 char * 为另一种类型设置别名,但不能使用其他方式。
这对我来说没有意义——如果我们有两个指针,一个 char * 类型和另一个 struct something * 类型指向同一个位置,第一个别名怎么可能是第二个但第二个不是第一个别名吗?
【问题讨论】:
-
您可以通过
char *读取T,但您不能通过T *读取任意char缓冲区。 -
这是一条规则,仅此而已...基本上允许编译器进行更多优化(与
restrict一样)...但恕我直言,编译器家伙也很懒... -
这是 C/C++ 工作方式不同的地方之一
-
@user3489275: 等等,也许我的引用不清楚 - 转换指针是可以的,但不能通过 char 指针写入对象的内存。 IE。当您写入内存时,会使原始对象无效。通过 char 指针读取对象的底层表示的字节非常好(实际上这就是任何 I/O 的工作方式)。
-
@KerrekSB:不是使用非平凡析构函数重用对象的内存(并因此终止生命周期)的 UB。尽管听起来很奇怪,但标准明确指出,只有在程序依赖于析构函数的副作用时,这才是未定义的。另外,我不认为通过
char*结束 对象的生命周期。使用placement new,当然,只是通过指针写...不太确定。
标签: c++ c strict-aliasing