zoukankan      html  css  js  c++  java
  • 卡马克的求平方根函数代码的陷阱

     首先感谢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选项提示编译器代码满足这个限制,所以可以提供编译器进行额外的代码优化的机会。

  • 相关阅读:
    ASP扫盲学习班第六课 添加新保存的数据
    三级联动菜单免刷新加载
    ASP按定制格式导出word文件的完美解决思路
    通用客户资源管理系统(客户资料保护库)
    SmR 通用信息采集系统(新闻小偷)
    ASP扫盲学习班第三课 程序界面的设计
    我的新作品(单身贵族网全站)
    《将博客搬至CSDN》
    我的新作品
    asp函数大全
  • 原文地址:https://www.cnblogs.com/kaikai/p/1529379.html
Copyright © 2011-2022 走看看