位置: IT常识 - 正文

GCC strict aliasing – 嫉妒就是承认自己不如别人

编辑:rootadmin
GCC strict aliasing – 嫉妒就是承认自己不如别人GCC strict aliasing事情是这样的。我们对tair(淘宝的分布式Key/Value系统)动了一次大手术,更换了网络框 GCC strict aliasing

推荐整理分享GCC strict aliasing – 嫉妒就是承认自己不如别人,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

事情是这样的。我们对tair(淘宝的分布式Key/Value系统)动了一次大手术,更换了网络框架,经过长时间的测试/调试,终于完全通过了回归测试。但要打包发布的时候,却发现服务器可以正常启动,但却完全无法接受请求。调试无果,对比打包前后程序的差异,仅在于是否使用-O2选项对程序进行编译优化。 无头苍蝇一样,Google搜索“gcc optimization problems”,找到StackOverflow上面的这个帖子,“抱着试试看的心态”,在编译选项中加入-fno-strict-aliasing,bingo! -fno-strict-aliasing这个选项是做什么的?aliasing又是什么?C和C++的标准给出了说明:

Strict aliasing is an assumption, made by the C (or C++) compiler, that dereferencing pointers toobjects of different types will never refer to the same memory location (i.e. alias eachother.)

即是说,在strict aliasing规则下,C/C++编译器认为,“不同类型”的指针(准确说是lvalue)一定不会引用同一个内存区域(即aliasing)。在这个规则的前提下,编译器就可以进行相应的优化。看下面这个函数:

12345678910int n;int foo(int *ptr) {n=1;*ptr=3;return n;}int main() {fprintf(stdout, "%d\n", foo(&n));return 0;}GCC strict aliasing – 嫉妒就是承认自己不如别人

编译并运行:

1234$ cc main.c && ./a.out3$ cc main.c -O2 && ./a.out3

一切正常,不是吗?但如果把函数foo的参数类型改作double*,运行结果“可能”会是:

123456$ cc main.c && ./a.out3$ cc main.c -O2 && ./a.out1$ cc main.c -O2 -fno-strict-aliasing && ./a.out3

在加-O2选项的情况下程序编译该程序,输出竟然是1,难道*ptr=3没有被执行吗?不是的,*ptr=3确实是执行了的,全局变量n在函数返回时也确实已经是3了(你可以在fprintf之后打印出n值做验证),但是foo函数中的语句return n却被优化成了return 1。为什么呢?因为后者比前者稍了一次内存访问。编译器为什么做这样的优化,为什么在ptr为int*时不做此优化? 这就涉及到strict aliasing的具体规则了。首先定义一下alias:两个不同的变量引用了同一个对象(内存区域),那么就称这两个变量互为alias。下面是C99中可以互为alias的所有情况,除此之外的其他情况下,如果编译时指定-fstrict-aliasing(-O2及以上优化时自动指定),那么就执行strict aliasing:

a type compatible with the effective type of the object,a qualified version of a type compatible with the effective type of the object,a type that is the signed or unsigned type corresponding to the effective type of the object,a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union),a character type.

大致是这样的:两个类型兼容的变量可以互为alias,即使使用了signed/unsigned和const/volatile等修饰符;一个类型可以与另一个包含与该类型兼容的成员的struct/union类型的变量互为alias;char类型可以与任意类型互为alias。C++中可以互为alias的还可以是父类与子类。

可以使用-fno-strict-aliasing来取消strict aliasing规则,同时也就放弃了这个规则带来的优化空间,放弃了一定的性能提升。如果你也遇到了文章开头我遇到的问题,而且担心-fno-strict-aliasing的性能损失,那就只能找出违反规则的代码,调整该代码,或者仅仅取消该代码的strict aliasing。

基本就是这样了,最后总结一下。GCC的aliasing与优化紧密相关,在指定-O2及以上优化级别时自动打开-fstrict-aliasing,执行strict aliasing规则以优化编译程序。如果你的程序不遵守该规则(比如上面foo函数中出现double*ptr和n同时应用n的情况),就极有可能受到惩罚。GCC中与strict aliasing相关的选项除了-fstrict-aliasing/-fno-strict-aliasing,还有warning选项-Wstrict-aliasing=n,这个选项在你违反stict aliasing时给出警告,其中n为检查的力度,一般设为2。

最后,如果想深入了解strict aliasing,可以参考这篇Understanding Strict Aliasing。另外,GCC的官方文档中有和优化选项相关的描述,其中也提到了strict aliasing。

本文链接地址:https://www.jiuchutong.com/zhishi/303221.html 转载请保留说明!

上一篇:Vue过渡和动画效果展示(案例、GIF动图演示、附源码)(vue数据加载完成显示页面过渡动画)

下一篇:MS Excel: COUNTIF Function (WS)

  • 找到这四个原因,让你的市场营销自动化效果倍增(找到原因用英语怎么说)

    找到这四个原因,让你的市场营销自动化效果倍增(找到原因用英语怎么说)

  • 华为rio-al00什么型号(华为rioal00什么处理器)

    华为rio-al00什么型号(华为rioal00什么处理器)

  • opporeno4pro有红外线功能吗(opporeno4有红外功能)

    opporeno4pro有红外线功能吗(opporeno4有红外功能)

  • vivo手机如何设置返回键(vivo手机如何设置动态壁纸)

    vivo手机如何设置返回键(vivo手机如何设置动态壁纸)

  • 荣耀30pro如何关闭悬浮球(荣耀30pro如何关闭更多推荐)

    荣耀30pro如何关闭悬浮球(荣耀30pro如何关闭更多推荐)

  • qq文字提取功能不见了(qq文字提取功能怎么用)

    qq文字提取功能不见了(qq文字提取功能怎么用)

  • 如何领取红包封面(如何领取红包封面序列号)

    如何领取红包封面(如何领取红包封面序列号)

  • 为什么应用锁只能用一次(为什么应用锁只能用一次OPPO)

    为什么应用锁只能用一次(为什么应用锁只能用一次OPPO)

  • 外拔转接来电什么意思(外拔已转接来电是怎么回事)

    外拔转接来电什么意思(外拔已转接来电是怎么回事)

  • 火山视频金币多少换1元(火山视频金币多少钱一个)

    火山视频金币多少换1元(火山视频金币多少钱一个)

  • 网线插座分五六类吗(网线面板插座区分六类还是五类)

    网线插座分五六类吗(网线面板插座区分六类还是五类)

  • 家里wifi突然消失(wifi突然消失)

    家里wifi突然消失(wifi突然消失)

  • 为什么安卓手机抖音不显示在线(为什么安卓手机能连上wifi苹果连不上)

    为什么安卓手机抖音不显示在线(为什么安卓手机能连上wifi苹果连不上)

  • 希沃授课助手可以在无网的情况下投屏吗(希沃授课助手可以录屏吗)

    希沃授课助手可以在无网的情况下投屏吗(希沃授课助手可以录屏吗)

  • 屏幕黑屏导出通讯录(屏幕黑屏怎么把手机里的文件导出来)

    屏幕黑屏导出通讯录(屏幕黑屏怎么把手机里的文件导出来)

  • ipad卡槽打不开怎么办(ipad pro卡槽弄不开)

    ipad卡槽打不开怎么办(ipad pro卡槽弄不开)

  • bkl-al00是什么版本(bbk al00什么型号)

    bkl-al00是什么版本(bbk al00什么型号)

  • 快手小店差评如何删除(快手小店差评怎么解决)

    快手小店差评如何删除(快手小店差评怎么解决)

  • 苹果8闹钟设置仅震动(苹果闹钟设置声音)

    苹果8闹钟设置仅震动(苹果闹钟设置声音)

  • 如何查找未保存的ppt文件(如何查找未保存的微信群)

    如何查找未保存的ppt文件(如何查找未保存的微信群)

  • 电脑掩码怎么查(怎么查电脑子网掩码)

    电脑掩码怎么查(怎么查电脑子网掩码)

  • 开启云服务收费吗(开启云服务有什么好处)

    开启云服务收费吗(开启云服务有什么好处)

  • 手机关机电话能打通吗(手机关机电话能打进去,响了几声显示对方忙)

    手机关机电话能打通吗(手机关机电话能打进去,响了几声显示对方忙)

  • 手机相册视频占内存怎么办(手机相册视频太多内存不足)

    手机相册视频占内存怎么办(手机相册视频太多内存不足)

  • vivoy3反向充电怎么使用(vivoy53s反向充电)

    vivoy3反向充电怎么使用(vivoy53s反向充电)

  • 苹果手机朋友圈怎么不被折叠(苹果手机朋友圈怎么发文字)

    苹果手机朋友圈怎么不被折叠(苹果手机朋友圈怎么发文字)

  • vivox27是闪充还是快充(vivox27充电是闪充吗)

    vivox27是闪充还是快充(vivox27充电是闪充吗)

  • 电费发票隔月开如何做账
  • 增值税是价内税,消费者是税款的最终负担者( ) A对 B错
  • 财务制度怎么定
  • 分公司财务负责人和总公司财务负责人
  • 免税苗木普通发票
  • 税负率是按月来算吗
  • 其他综合收益是什么类科目
  • 税盘锁了还能报税吗
  • 民营企业的待遇
  • 临时聘用人员费用谁承担
  • 建筑工程勘察费占设计费的比例
  • 预收装修款并开发票如何转成本?
  • 学校收到政府拨付的助学金和奖学金需要缴纳税款吗
  • 公司将固定资产卖出,要交什么税
  • 销项税额与进项税额区别
  • 在建工程需要交哪些税
  • 兼营小规模纳税人增值税优惠
  • 长期待摊费用无发票怎么处理
  • 审计报告格式与范文怎么写?
  • 厂家给返点算拿回扣吗
  • 培训费和差旅费可以一起报嘛
  • 惠普台式电脑配置及价格
  • 增值税减免算什么费用
  • 红字发票记账如何记账
  • gh树形数据是什么意思
  • 承兑汇票还款
  • 自来水公司的水压力是多少
  • apache运行php
  • 换购商品分录怎么做
  • powershell.exe什么意思
  • 电脑语言栏不见了,打不出汉字
  • vue做移动端
  • 多开票金额会计分录
  • 企业经费独立使用的原因
  • react.strictmode
  • ps制作折扇效果图
  • 坏账的确认条件税务会查吗
  • 出差补贴要扣税吗
  • 可以主营业务成本增加现金减少吗
  • 应付未付货款会计分录
  • 未开票收入如何做账
  • vuex数据持久化
  • 财政拨付注册资本金说明
  • 企业所得税季报资产总额季初季末
  • 政府奖励收入会计分录
  • 长期借调人员工资福利
  • 税法中减除和减退的区别
  • sqlserver 创建链接服务器
  • 管理费用错账怎么处理
  • 劳务外包合同需要注意什么
  • 可供出售金融资产名词解释
  • 企业收到房租发票怎么做账
  • 金蝶财务软件固定资产
  • 营业外收入与其他业务收入的区别
  • 工程怎么做会计分录
  • 兼职费计入什么科目
  • 印花税征税对象包括
  • 二类银行卡转账能收多少钱
  • php 访问数据库
  • 不同数据库之间的数据一同传递
  • mac如何设置默认打开程序
  • win7旗舰版32位系统激活
  • linux忘记密码怎么重启
  • realshed.exe - realshed是什么进程 有什么用
  • 多个网页怎么从一个网页中显示
  • linux如何给网卡配置ip地址
  • win7双显示器设置
  • win8怎么设置桌面图标
  • jquery插件怎么用到自己的网站
  • perl 计算
  • linuxparted命令
  • unity点击播放声音
  • angularjs2
  • linux0.11编译
  • 网页js调试
  • 报价单盖什么公章
  • 填了专项附加扣除但没有进行综合年度汇算
  • 机打发票真伪查询
  • 北京地税局上班时间查询
  • 电力营销岗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设