惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
G
Google Developers Blog
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
小众软件
小众软件
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
P
Proofpoint News Feed
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
The Cloudflare Blog
博客园_首页
美团技术团队
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - kaikai

visual studio生成后调试启动又提示部分项目需要生成问题总结 让vc2010的项目在vc2012也能直接使用,而不必修改PlatformToolSet TFS:添加已经在项目中但不在TFS中的文件 宅电脑桌 动作游戏自定义技能探讨 TFS如何跨分支合并未签入的文件 友元接口-限制你的友元类数量 g++上c++模板与padding交互产生的陷阱 [zt]调试的时候,无法设置数据断点(为灰色) [zt]关闭VS自带的提示 vs偶尔出现链接时间过长的情况的临时处理方法 vs链接小知识,/LTCG 这是一场正义的战争,伟大而又激烈! 浮点数默认精度在windows/linux上的差异 数独求解程序 阿朱~你走好 短代码.EOF串 短代码.第几天 短代码.求2点之距离
卡马克的求平方根函数代码的陷阱
kaikai · 2009-07-23 · via 博客园 - kaikai
 

首先感谢xq; lj定位问题!

 问题出在我签入的来自卡马克的求平方根函数代码。

Code

红色部分代码在gcc开启-fstrict-aliasing选项后将得到错误的代码。由于使用了type-punned pointer将打破strict-aliasing规则。

由于-fstrict-aliasing选项在-O2, -O3, -Os等优化模式下都将开启(目前dev不带优化,main-O3所以该问题只在main上出现)所以建议对linux编译中产生
warning: dereferencing type-punned pointer will break strict-aliasing rule
警告的情况作为编译失败。以便防止出现类似问题。
上述代码应当使用联合体重写为:

Code

这样就不会打破该规则。

什么是
Strict Aliasing?请看:http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasing.html?

In C99, it is illegal to create an alias of a different type than the original.

在我们现在的代码中可以按正则表达式\([^()]+\*:b*\):b*&找到约180个匹配行,涉及60个文件。
这其中应该有一些是不符合这个strict-aliasing要求的。
处理方法
1是临时关闭strict-aliasing选项:在使用-O2, -O3, -Os编译的情况下使用-fno-strict-aliasing关闭strict-aliasing
2是要修改这类不满足该限制的代码,在完全修改完毕之后再打开。
要注意到,strict-aliasing选项提示编译器代码满足这个限制,所以可以提供编译器进行额外的代码优化的机会。