Visual C++是否支持"严格别名"?

dig*_*ale 7 strict-aliasing visual-c++

我最近惊讶地发现C和C++语言标准有一个"严格别名"规则.实质上,该规则禁止不同类型的变量引用相同的内存位置.

举个例子:

char buffer[4] = { 0x55, 0x66, 0x77, 0x88 };
int32 *p = (int32*)&buffer[0]; // illegal because buffer[0] and *p are different types
Run Code Online (Sandbox Code Playgroud)

我与之交互的大多数专业C++开发人员都不熟悉这条规则.根据我的研究,它似乎主要影响GCC/G ++/CLANG用户.Visual C++是否支持启用/禁用此规则?如果是这样,那么一个人怎么做?

谢谢

MSa*_*ers 6

"严格别名"是限制程序而不是编译器的C++规则.由于违反规则是未定义行为,因此无需任何诊断,编译器无需以任何方式支持它.

也就是说,微软在应用优化方面不那么积极.就在上周,他们宣布他们的新优化器假定没有签名溢出,这是GCC已经假设了几年的事情.严格的别名会破坏一些Windows标题,因此需要先修复它们.(有几种类型的行为就像它们包含unions一样,但它们并没有正式定义为这样)