位置: 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)

  • vivox70pro+上市时间和价格(vivoX70Pro+上市时间)

    vivox70pro+上市时间和价格(vivoX70Pro+上市时间)

  • 苹果流量用不了怎么回事(苹果流量用不了了怎么回事)

    苹果流量用不了怎么回事(苹果流量用不了了怎么回事)

  • 腾讯视频手机号怎么登录(腾讯视频手机号登录在哪里)

    腾讯视频手机号怎么登录(腾讯视频手机号登录在哪里)

  • 视频siri声音怎么弄啊(视频里的siri声音)

    视频siri声音怎么弄啊(视频里的siri声音)

  • 恢复回收站清空的照片(恢复回收站清空的文件怎么恢复)

    恢复回收站清空的照片(恢复回收站清空的文件怎么恢复)

  • iphone6发热严重怎么办(iPhone6发热严重)

    iphone6发热严重怎么办(iPhone6发热严重)

  • 华为p40指纹位置可以变吗(华为p40的指纹)

    华为p40指纹位置可以变吗(华为p40的指纹)

  • 腾讯会议电脑版有回声(腾讯会议电脑版怎么静音)

    腾讯会议电脑版有回声(腾讯会议电脑版怎么静音)

  • 个人订阅号一天只能发一篇吗(个人订阅号一天发几篇)

    个人订阅号一天只能发一篇吗(个人订阅号一天发几篇)

  • 能用视频代替刷脸吗(可以刷视频的软件有哪些不赚钱)

    能用视频代替刷脸吗(可以刷视频的软件有哪些不赚钱)

  • cpu单核和多核的区别(cpu单核多核的区别)

    cpu单核和多核的区别(cpu单核多核的区别)

  • 网络中的计算机资源主要指什么(网络中的计算机的MAC地址指的是_____地址)

    网络中的计算机资源主要指什么(网络中的计算机的MAC地址指的是_____地址)

  • 锂电池是一次电池还是二次电池(锂电池是一次电源)

    锂电池是一次电池还是二次电池(锂电池是一次电源)

  • 电脑屏幕分辨率突然变大了怎么办(电脑屏幕分辨率调不了怎么办)

    电脑屏幕分辨率突然变大了怎么办(电脑屏幕分辨率调不了怎么办)

  • 怎么关闭微信暗黑模式(微信怎么关闭暗色模式)

    怎么关闭微信暗黑模式(微信怎么关闭暗色模式)

  • 苹果商店更新不见了(苹果商店更新不了app)

    苹果商店更新不见了(苹果商店更新不了app)

  • 电脑钉钉看直播挂窗口算看吗(电脑钉钉看直播的时候可以静音吗)

    电脑钉钉看直播挂窗口算看吗(电脑钉钉看直播的时候可以静音吗)

  • 以太网和局域网的区别(以太网和局域网的关系)

    以太网和局域网的区别(以太网和局域网的关系)

  • 闲鱼怎么编辑为卖掉了(闲鱼怎么编辑文案)

    闲鱼怎么编辑为卖掉了(闲鱼怎么编辑文案)

  • i37100安装什么系统(i3-7100安装win7)

    i37100安装什么系统(i3-7100安装win7)

  • icloud钥匙串是啥(icloud钥匙串的作用)

    icloud钥匙串是啥(icloud钥匙串的作用)

  • pbbmoo是什么手机型号(pbem00是什么手机)

    pbbmoo是什么手机型号(pbem00是什么手机)

  • 悉心的近义词(悉心的近义词和反义词)

    悉心的近义词(悉心的近义词和反义词)

  • 荣耀手环3能不能接电话(荣耀手环3能不能刷门禁卡)

    荣耀手环3能不能接电话(荣耀手环3能不能刷门禁卡)

  • 虾米音乐怎么下载到u盘(虾米音乐怎么下载mp3格式)

    虾米音乐怎么下载到u盘(虾米音乐怎么下载mp3格式)

  • 微信活动账单什么意思(微信 活动账单)

    微信活动账单什么意思(微信 活动账单)

  • 苹果手机怎么返回桌面(苹果手机怎么返回键在哪里设置)

    苹果手机怎么返回桌面(苹果手机怎么返回键在哪里设置)

  • 自动目录怎么做(word一键生成目录)

    自动目录怎么做(word一键生成目录)

  • Javascript 基础知识学习(javascript入门基础)

    Javascript 基础知识学习(javascript入门基础)

  • 上月少计提的个税本月怎么调整
  • 增值税视同销售账务处理怎么做?
  • 全年一次性奖金税收优惠政策
  • 增值税税率调整文件
  • 物业公司物业费不开发票
  • 进项税额转出税率
  • 所有者权益是
  • 资产负债表月报期末余额怎么填
  • 个税申报 两种方式
  • 金税盘全额抵扣分录
  • 工资结算单属于通用凭证吗
  • 资助的开发经费可税前扣除吗
  • 行政单位特殊人工手机电话费是否可以报销
  • 固定资产暂估入账的账务处理
  • 企业购入物资合同模板
  • 学校提供场地开发方案
  • 个人转让土地使用权 增值税
  • 学校发票抬头类型填企业还是非企业
  • 监控系统施工费用包括哪些内容
  • 建筑业跨区预缴增值税未预缴
  • 土地闲置费能否扣除
  • 外资企业税率是多少
  • 外贸出口退税会计和会计区别
  • tp link无线路由器设置
  • 事业单位服务收入怎么做账
  • 废料销售成本怎么计算
  • 冲减坏账准备和计提坏账准备
  • 收入成本配比原则
  • mac cpu
  • macbook无限输入z
  • gnu/linux
  • 收到客户预付的保费90000元,存入银行
  • 股份有限公司向股东借款
  • 贷款减值准备什么科目
  • 林木业折旧年限
  • 常见反爬策略
  • vue的常见面试题
  • 企业的安全费用怎么弄
  • 建筑企业异地预缴增值税计算
  • 什么叫呆账账户
  • 关于在使用手机
  • threejs 3dtiles
  • centos8 mongodb
  • 保险公司工伤怎么赔付
  • 企业残保金计提分录
  • sql server的go
  • 现代服务业进项抵扣新政策
  • 现金收支月报表
  • 给客户退款怎么说
  • 留抵进项税额怎么做分录
  • 出口退税企业退税流程
  • 实物投资需要缴纳增值税吗
  • 预发绩效会计分录
  • 所得税费用为什么不计入营业利润
  • 开出去的发票
  • 管理费用和财务费用属于什么科目
  • 没有关联企业怎么选不了否
  • sqlserver (parse name)字符串截取的方法
  • mysql缓冲区
  • sql存储过程简单例题
  • win8自启动在哪儿设置
  • windowxp系统升级
  • gb4.exe
  • centos怎么打开软件
  • 关闭windbg
  • win8如何设置默认输入法
  • win10怎么设置图片
  • ie等级
  • cocos2dx android游戏防破解总结
  • js设置iframe隐藏
  • python搜索引擎网络爬虫
  • shell脚本取n天前的日期
  • python中验证码校验
  • 套接字java
  • jquery 遍历
  • JQuery之proxy实现绑定代理方法
  • python 电话号码
  • 上海地铁和公交乘车码
  • 福建闽江人才服务中心可靠吗
  • 丰田2.0和2.5混动发动机
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设