在g++中启用严格别名警告

6

如何正确启用g ++中的严格别名警告?VC++ 10是否实现了这些规则?


3
规则始终处于“启用”状态,只有提示你何时违反规则的警告是可选的。 - Lightness Races in Orbit
3个回答

4

请在使用g++时加上-fstrict-aliasing选项。我还会使用-Wstrict-aliasing=2来查看与严格别名规则可能有违反相关的警告。


3

它们会被-O2自动启用,因为需要使用它们来执行一些优化。一定要与警告(-Wall就可以)结合使用,以确保您不会构建潜在有错的代码。否则,您可以使用另一个答案中提到的-fstrict-aliasing来启用它们。

但是,我不确定VC++10是否支持。


1

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

但是看起来没有办法启用警告以避免违反此规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接