如何正确启用g ++中的严格别名警告?VC++ 10是否实现了这些规则?
如何正确启用g ++中的严格别名警告?VC++ 10是否实现了这些规则?
请在使用g++
时加上-fstrict-aliasing
选项。我还会使用-Wstrict-aliasing=2
来查看与严格别名规则可能有违反相关的警告。
它们会被-O2
自动启用,因为需要使用它们来执行一些优化。一定要与警告(-Wall
就可以)结合使用,以确保您不会构建潜在有错的代码。否则,您可以使用另一个答案中提到的-fstrict-aliasing
来启用它们。
但是,我不确定VC++10是否支持。
VC++ 10启用了/O1及以上的严格别名规则。我在这里的“严格别名规则的好处”章节中使用了测试程序(计数值为6),并获得了以下汇编代码。您可以看到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
但是看起来没有办法启用警告以避免违反此规则。