在g ++中启用严格别名警告的正确方法是什么? VC ++ 10是否实现了这些规则?
答案 0 :(得分:4)
-fstrict-aliasing
使用g++
。我还使用-Wstrict-aliasing=2
查看与可能违反严格别名规则相关的警告。
答案 1 :(得分:3)
它们由-O2
自动启用,因为它需要使用它们来执行某些优化。绝对将它与警告(-Wall
完成技巧)结合起来,以确保您没有构建潜在的错误代码。否则,您可以使用另一个答案中显示的-fstrict-aliasing
来启用它们。
然而,我不确定VC ++ 10。
答案 2 :(得分:1)
VC ++ 10使用/ O1及更高版本启用严格别名规则。我在here的“严格混淆规则的好处”一章中使用了测试程序(计数值为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
但看起来没有办法启用违反此规则的警告。