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

  • 华为mate10与mate30拍照对比(华为mate10与mate10pro的区别)

    华为mate10与mate30拍照对比(华为mate10与mate10pro的区别)

  • 阿里巴巴国际站属于什么类型的跨境电商网站(阿里巴巴国际站官网入口)

    阿里巴巴国际站属于什么类型的跨境电商网站(阿里巴巴国际站官网入口)

  • 电脑在欢迎界面一直转(电脑在欢迎界面一直转圈然后黑屏)

    电脑在欢迎界面一直转(电脑在欢迎界面一直转圈然后黑屏)

  • 苹果电池83%用不用换(苹果电池 83%)

    苹果电池83%用不用换(苹果电池 83%)

  • 小电充电宝可以自己在家充电吗(小电充电宝可以随便还吗)

    小电充电宝可以自己在家充电吗(小电充电宝可以随便还吗)

  • 手机卡变成空号还可以恢复吗(手机卡变成空号后缴费会恢复吗)

    手机卡变成空号还可以恢复吗(手机卡变成空号后缴费会恢复吗)

  • se2有无线充电吗(se2可以无线充电吗)

    se2有无线充电吗(se2可以无线充电吗)

  • 腾讯会议手机可以共享屏幕吗(腾讯会议手机可以开摄像头吗)

    腾讯会议手机可以共享屏幕吗(腾讯会议手机可以开摄像头吗)

  • 键盘上句号是哪一个键(键盘上的句号是哪个键)

    键盘上句号是哪一个键(键盘上的句号是哪个键)

  • 安卓4.3版本用不了微信怎么办(安卓4.3版本用不了怎么办)

    安卓4.3版本用不了微信怎么办(安卓4.3版本用不了怎么办)

  • 不能启动此对象的源应用程序是什么意思(不能启动此对象的源应用程序 wps公式)

    不能启动此对象的源应用程序是什么意思(不能启动此对象的源应用程序 wps公式)

  • 快手上传视频怎么保持原画质(快手上传视频怎么赚钱)

    快手上传视频怎么保持原画质(快手上传视频怎么赚钱)

  • 怎么隐藏自己的微信号(怎么隐藏自己的ip地址)

    怎么隐藏自己的微信号(怎么隐藏自己的ip地址)

  • 抖音直播同城的人进不来是什么情况(抖音直播同城的人进不了直播间)

    抖音直播同城的人进不来是什么情况(抖音直播同城的人进不了直播间)

  • 苹果手机通话记录突然不同步(苹果手机通话记录怎么没有了)

    苹果手机通话记录突然不同步(苹果手机通话记录怎么没有了)

  • word文档和ppt区别(word和ppt区别)

    word文档和ppt区别(word和ppt区别)

  • 唯品会退款一般几天到账(唯品会退款的钱几天到账)

    唯品会退款一般几天到账(唯品会退款的钱几天到账)

  • 只有群主才能踢人吗(只有群主才能踢人出群吗)

    只有群主才能踢人吗(只有群主才能踢人出群吗)

  • 常用的三种拓扑结构(常用的拓扑结构有哪几种)

    常用的三种拓扑结构(常用的拓扑结构有哪几种)

  • 抖音号被禁了怎么解封(抖音号被禁怎么解决)

    抖音号被禁了怎么解封(抖音号被禁怎么解决)

  • word页面并排显示(word文档页面并列怎么变成竖排)

    word页面并排显示(word文档页面并列怎么变成竖排)

  • 华为nfc怎么用门禁卡(华为手机nfc门)

    华为nfc怎么用门禁卡(华为手机nfc门)

  • vivoz5按键怎么设置(vivoz1的按键怎么设置)

    vivoz5按键怎么设置(vivoz1的按键怎么设置)

  • 内存卡扩容是什么意思(内存卡扩容有什么坏处)

    内存卡扩容是什么意思(内存卡扩容有什么坏处)

  • 华为鲲鹏是什么意思(华为鲲鹏是什么股票)

    华为鲲鹏是什么意思(华为鲲鹏是什么股票)

  • xsmax是2k屏幕吗

    xsmax是2k屏幕吗

  • 打电话录音怎么录(打电话录音怎么发给别人)

    打电话录音怎么录(打电话录音怎么发给别人)

  • 抖音怎么弄小号(抖音怎么弄小号没有其他手机号)

    抖音怎么弄小号(抖音怎么弄小号没有其他手机号)

  • 新版Edge浏览器开启“标签页关闭控制器”功能(新版edge浏览器兼容模式怎么设置)

    新版Edge浏览器开启“标签页关闭控制器”功能(新版edge浏览器兼容模式怎么设置)

  • 个税手续费返还要交增值税吗
  • 转出未交增值税是借方还是贷方
  • 个体工商户营业执照需要什么材料
  • 累计折旧 计提折旧
  • 其他权益工具账务处理内容
  • 投标成交服务费
  • 应付职工薪酬在资产负债表怎么填
  • 审计查账查什么
  • 保险公司营销人员个人先进事迹材料
  • 报销应聘人员差旅费
  • 企业所得税财务费用借款利息扣除标准
  • 跨境电商有进口吗
  • 收到失控发票写情况说明
  • 土地租金及青苗赔偿款怎么做账?
  • 未取得支付工程款的发票怎么做账?
  • 自产自销免税物品包括哪些
  • 收到银行存款怎么记账
  • 旧税号开出的发票能认证抵扣吗?
  • 文化建设费的征收标准
  • 固定资产小于500万一次性扣除政策
  • 个人借款利息收入增值税税率
  • 销售结算款扣款怎么记账?
  • 地下车库是否需要设置消防电梯?
  • 企业合并资本公积转留存收益
  • 烟酒专用发票能抵税吗
  • 没有金税盘怎么查询已开发票
  • 收到带息商业票据贴现会计处理
  • 土地租赁期间政府征收
  • win10删除所有内容是什么意思
  • 期初建账分录
  • 基本户里面的钱的用途
  • powerdvd remote
  • php function
  • 人工智能时代如何培养孩子
  • 出让土地使用权和转让土地使用权的区别
  • php开发实例大全
  • php操作mysql数据库
  • 应收账款与预收账款重分类表怎么做
  • php分页思路
  • php调用java接口
  • yii2.0框架
  • 固定资产清理应交增值税怎么算
  • 持有待售资产属于
  • 企业自建办公楼需要开发资质吗
  • db2bigint
  • 期权分为哪几种
  • 未分配利润转增股本要交税吗怎么交
  • 小规模开票的税点是多少
  • 生产经营所得如何申请退税
  • 补发工资如何计税计算
  • 银行代扣水费分录
  • 工程施工的成本
  • 原材料运费如何入账
  • 未交增值税增加记哪方
  • 售房中心给客人怎么说
  • 成本核算的意义在于
  • 水果销售公司怎么起名字好听
  • sql server2000个人版安装步骤
  • win2008 r2 hosts文件修改方法
  • steam游戏支持的手柄
  • ubuntu2004分区教程
  • xp安装磁盘格式
  • ubuntu查cpu信息
  • linux卸载apache2
  • 如何配置sendmail
  • react常用框架
  • js 列表
  • node.js配置
  • 用unity做2d游戏
  • unity后期
  • jquery移动div
  • node-js
  • javascript面向对象编程指南第三版
  • javascript面向对象精要pdf下载
  • python提取信息
  • javascript Base类 包含基本的方法
  • 税收分类分级管理后如何开展风险管理
  • 百旺税控盘怎么清卡成功
  • acfunp
  • 增值税率下降
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设