use*_*275 20 c c++ strict-aliasing
什么是严格别名规则的接受答案?提到您可以使用char *别名而不是其他方式.
这对我来说没有意义 - 如果我们有两个指针,一个是指向同一个位置的类型char *,另一个struct something *指向同一个位置,那么第一个别名可能是第二个但第二个不是第一个别名吗?
Lig*_*ica 12
如果我们有两个指针,一个是指向同一个位置的类型
char *,另一个struct something *指向同一个位置,那么第一个别名可能是第二个但第二个不是第一个别名吗?
确实如此,但这不是重点.
关键是如果你有一个或多个struct somethings,那么你可以使用a char*来读取它们的组成字节,但是如果你有一个或多个chars,那么你可能不会用a struct something*来读它们.
Mik*_*eMB 11
引用答案中的措辞略有错误,所以让我们首先解决这个问题:一个对象永远不会混淆另一个对象,但是两个指针可以"混淆"同一个对象(意思是,指针指向相同的内存位置 - 就像MM指向的那样出来,这仍然不是100%正确的措辞,但你得到的想法).此外,标准本身并不(据我所知)实际上谈论严格的别名,但只提供规则,通过这些规则可以访问或不访问对象.像'-fno-strict-aliasing'这样的编译器标志告诉编译器是否可以假定程序员遵循这些规则(因此它可以根据该假设执行优化)或不执行.
现在,你的问题:任何物体可以通过访问指针来char,但一个char 对象(尤其是字符数组)可能无法通过其他大多数指针类型进行访问.基于此,编译器可以/必须做出以下假设:
char*并且T*始终指向同一对象(别名别名) - >对称关系.T1和T2是不是"相关的",而不是char,然后T1*和T2*可能永远指向同一个对象- >对称关系char*可以指向charOR T 对象T*可以不指向一个char 对象 - > 一个对称的关系我相信,关于通过指针访问对象的不对称规则 背后的主要原理是数组可能不满足例如a的对齐要求. charint
因此,即使没有基于严格别名规则的编译器优化,例如int,char在地址0x1,0x2,0x3,0x4处写入4字节数组的位置- 在最好的情况下 - 会导致性能不佳 - 在最坏的情况下case - 访问不同的内存位置,因为CPU指令在写入4字节值时可能会忽略最低的两个地址位(因此这可能会导致写入0x0,0x1,0x2和0x3).
另请注意,"相关"的含义因语言而异(在C和C++之间),但这与您的问题无关.