Visual C++ 是否支持 "strict aliasing"?
Does Visual C++ support "strict aliasing"?
我最近惊讶地得知 C 和 C++ 语言标准有一个 "strict aliasing" 规则。本质上,该规则禁止不同类型的变量引用相同的内存位置。
举个例子:
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++ 支持 enabling/disabling 这个规则吗?如果是这样,如何做到这一点?
谢谢
"Strict aliasing"是C++规则限制程序,不是编译器。由于违反规则是未定义的行为,因此不需要诊断编译器不需要以任何方式支持它。
也就是说,Microsoft 在应用优化方面不太激进。就在上周,他们才宣布了他们的新优化器 assumes no signed overflow,这是 GCC 已经假设了几年的东西。严格的别名会破坏一些 Windows headers,所以那些需要先修复。 (一些类型的行为就好像它们包含 union
一样,但它们并没有正式定义为这样)
我最近惊讶地得知 C 和 C++ 语言标准有一个 "strict aliasing" 规则。本质上,该规则禁止不同类型的变量引用相同的内存位置。
举个例子:
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++ 支持 enabling/disabling 这个规则吗?如果是这样,如何做到这一点?
谢谢
"Strict aliasing"是C++规则限制程序,不是编译器。由于违反规则是未定义的行为,因此不需要诊断编译器不需要以任何方式支持它。
也就是说,Microsoft 在应用优化方面不太激进。就在上周,他们才宣布了他们的新优化器 assumes no signed overflow,这是 GCC 已经假设了几年的东西。严格的别名会破坏一些 Windows headers,所以那些需要先修复。 (一些类型的行为就好像它们包含 union
一样,但它们并没有正式定义为这样)