6

在 g++ 中启用严格别名警告的正确方法是什么?VC++ 10 是否实现了这些规则?

4

3 回答 3

4

用于. -fstrict-aliasing_ g++我还用于-Wstrict-aliasing=2查看与可能违反严格别名规则有关的警告。

于 2011-12-18T15:45:28.977 回答
3

它们是自动启用的,-O2因为它需要使用它们来进行一些优化。绝对将它与警告结合起来(-Wall可以解决问题),以确保您没有构建潜在的错误代码。否则,您可以使用-fstrict-aliasing在另一个答案中看到的来启用它们。

但是,我不确定 VC++10。

于 2011-12-18T15:56:36.253 回答
1

VC++ 10 使用 /O1 及更高版本启用严格的别名规则。我在此处的“严格别名规则的好处”一章中使用了测试程序(计数值为 6)。并获得以下 asm 代码。你可以看到 b 的加载只完成了一次。

00A910AE  movzx       edx,word ptr [edx+2]  //Load of b
00A910B2  xor         eax,eax  
00A910B4  xor         ecx,ecx  
00A910B6  add         dword ptr [esp+eax*4+34h],edx  //Loop start
00A910BA  add         eax,1  
00A910BD  adc         ecx,edi  
00A910BF  jne         main+76h (0A910C6h)  
00A910C1  cmp         eax,6  
00A910C4  jb          main+66h (0A910B6h)  //Loop end

但看起来没有办法启用违反此规则的警告。

于 2011-12-18T17:16:00.437 回答