GMa*_*ckG 19
存在描述混叠得很彻底页面在这里.
总而言之,当两个不同类型的指针访问同一位置时,编译器不能假设数据的值(即它必须每次都读取该值,因此不能进行优化).
仅当未强制执行严格别名时才会发生这种情况.严格的别名选项:
将此代码复制粘贴到main.c中:
void f(unsigned u)
{
unsigned short* const bad = (unsigned short*)&u;
}
int main(void)
{
f(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下选项编译代码:
gcc main.c -Wall -O2
你会得到:
main.c:3:警告:解除引用类型惩罚指针将破坏严格别名规则
禁用别名:
gcc main.c -fno-strict-aliasing -Wall -O2
警告消失了.(或者只是取出-Wall但......如果没有它就不能编译)
尽我所能我无法让MSVC给我一个警告.