我最近惊讶地发现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 ++是否支持启用/禁用此规则?如果是这样,一个人怎么做?
谢谢
答案 0 :(得分:6)
“严格别名”是限制程序而不是编译器的C ++规则。由于违反规则是未定义的行为,无需诊断,编译器无需以任何方式支持它。
也就是说,微软在应用优化方面不那么积极。就在上周,他们才宣布了他们的新优化器assumes no signed overflow,这是GCC已经假设了几年的事情。严格的别名会破坏一些Windows标题,因此需要先修复它们。 (有几种类型的行为好像它们包含union
s,但它们并没有正式定义为这样)