我最近惊讶地发现 C 和 C++ 语言标准有“严格别名”规则。本质上,该规则禁止不同类型的变量引用同一内存位置。
举个例子:
char buffer[4] = { 0x55, 0x66, 0x77, 0x88 };
int32 *p = (int32*)&buffer[0]; // illegal because buffer[0] and *p are different types
与我打交道的大多数专业 C++ 开发人员都不熟悉这条规则。根据我的研究,它似乎主要影响 GCC/G++/CLANG 用户。 Visual C++ 是否支持启用/禁用此规则?如果是这样,如何做到这一点?
谢谢
最佳答案
“严格别名”是限制程序而不是编译器的 C++ 规则。由于违反规则是未定义行为,无需诊断,编译器不需要以任何方式支持它。
也就是说,微软在应用优化方面没有那么积极。就在上周,他们才宣布了新的优化器 assumes no signed overflow ,这是 GCC 几年前就已经假设的。严格的别名会破坏一些 Windows header ,因此需要首先修复这些 header 。 (一些类型的行为就好像它们包含union
,但它们没有正式定义)
关于visual-c++ - Visual C++ 支持 "strict aliasing"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176461/