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

  • 北京健康宝怎么解除居家观察(北京健康宝怎么关联外地核酸检测结果)

    北京健康宝怎么解除居家观察(北京健康宝怎么关联外地核酸检测结果)

  • 淘宝直播怎么关闭弹幕(淘宝直播怎么关闭回放)

    淘宝直播怎么关闭弹幕(淘宝直播怎么关闭回放)

  • zoom怎么设置虚拟背景(zoom怎么设置虚拟人物)

    zoom怎么设置虚拟背景(zoom怎么设置虚拟人物)

  • vivo手机怎么激活(vivo手机怎么解锁?)

    vivo手机怎么激活(vivo手机怎么解锁?)

  • 可以无线充电的手机有哪些(可以无线充电的vivo手机)

    可以无线充电的手机有哪些(可以无线充电的vivo手机)

  • 斗鱼备用线路什么意思(斗鱼一进房间就是备用线路)

    斗鱼备用线路什么意思(斗鱼一进房间就是备用线路)

  • 神舟笔记本怎么样(神舟笔记本怎么开启独显直连)

    神舟笔记本怎么样(神舟笔记本怎么开启独显直连)

  • 宽带5g什么意思(宽带的5g)

    宽带5g什么意思(宽带的5g)

  • 变频器oc1怎么解决(变频器报警oc1怎么解除)

    变频器oc1怎么解决(变频器报警oc1怎么解除)

  • 毒退货要扣钱吗(毒退货花钱吗)

    毒退货要扣钱吗(毒退货花钱吗)

  • 支付宝收钱语音怎么打开(支付宝收钱语音音响哪里买)

    支付宝收钱语音怎么打开(支付宝收钱语音音响哪里买)

  • 头条号注销后多久可以重新注册(头条号注销多久生效)

    头条号注销后多久可以重新注册(头条号注销多久生效)

  • 华为nova5怎么更改锁屏密码(华为nova5怎么更改手机密码)

    华为nova5怎么更改锁屏密码(华为nova5怎么更改手机密码)

  • 手机的勿扰模式有什么作用(手机的勿扰模式在哪里设置)

    手机的勿扰模式有什么作用(手机的勿扰模式在哪里设置)

  • 微信加错人了怎么取消(微信加错人了怎么不添加她)

    微信加错人了怎么取消(微信加错人了怎么不添加她)

  • 主机系统特征(主机系统有哪些组成)

    主机系统特征(主机系统有哪些组成)

  • 怎么查看支付宝好友是否被删除(怎么查看支付宝银行卡余额)

    怎么查看支付宝好友是否被删除(怎么查看支付宝银行卡余额)

  • 手机网络限速怎么办(手机网络限速怎样恢复)

    手机网络限速怎么办(手机网络限速怎样恢复)

  • 小米9pro怎么导入联系人(小米9怎么传输视频)

    小米9pro怎么导入联系人(小米9怎么传输视频)

  • 在哪设置群名片(群成员名片怎么弄)

    在哪设置群名片(群成员名片怎么弄)

  • 小米6无线充电设置(小米6无线充电吗)

    小米6无线充电设置(小米6无线充电吗)

  • oppoa9电池容量(oppoa9手机电池容量)

    oppoa9电池容量(oppoa9手机电池容量)

  • 如何把图片制作视频(如何把图片制作成动图)

    如何把图片制作视频(如何把图片制作成动图)

  • 佳能闪光灯怎么关(佳能闪光灯怎么调)

    佳能闪光灯怎么关(佳能闪光灯怎么调)

  • 游戏玩的多,陪玩你了解的多吗?用Python来采集陪玩数据,看看行情和美照(玩很多游戏的人)

    游戏玩的多,陪玩你了解的多吗?用Python来采集陪玩数据,看看行情和美照(玩很多游戏的人)

  • 劳保用品发放制度文件
  • 个人所得税可以不交税吗
  • 单身租房可以专租房吗
  • 退回的税款如何做账
  • 收到违约金如何入账
  • 用友怎么结转本期损益
  • 本月完工入库会计分录
  • 会计核算的具体流程
  • 公司水费怎么做账
  • 固定资产残值怎么计算出来的
  • 年终零余额账户有余额
  • 减免的教育费附加和地方教育费附加怎么做分录
  • 工程外管证核销是什么意思
  • 免税企业收到的专用发票要怎么转出
  • 工程服务税收的分类
  • 装修公司一般纳税人纳税标准
  • 现金流量表中现金流量净额怎么算
  • 文化建设事业费优惠政策
  • 企业所得税应纳税所得额不得扣除
  • 协定存款分析及2018金融机构人民币存款基准利率表
  • 房屋融资租赁会计处理
  • 企业所得税以前年度亏损怎么弥补
  • 对外支付代扣代缴增值税如何申报
  • 工商年报缴费基数是什么意思
  • 职工医疗保险补交6万与交居民每交300哪个合算?
  • 路由器晚上关了,早上再开信号会好吗?
  • php生成条形码的代码
  • php array add
  • 定额发票丢失了怎么补办
  • mongodb4.4安装
  • javascript教程
  • 电子发票开出后如何查看
  • 销售收入是不是销售额
  • 其他权益工具投资是什么类科目
  • 个企年报怎么申报
  • python如何运行
  • 织梦模板安装完整教程
  • 独资企业和公司区别
  • 母公司借款给子公司如何做账
  • 公司清算的特征
  • 一般纳税人应交增值税
  • mysql创建数据库的操作步骤
  • 去年亏损今年有盈利合伙企业怎么交生产经营所得税
  • 我国消费现状分析
  • 会计 借方 贷方
  • 融资租赁增值税的计税依据
  • 员工宿舍发生事故赔偿吗
  • 制造费用月末怎么结转到生产成本
  • 什么是流动负债确认条件是什么
  • 企业利润分为四个方面
  • 免税蔬菜税额用什么表示
  • 企业项目贷款所需资料
  • 核定征收需要带什么资料
  • 会计凭证数字书写模板
  • sqlserver存储过程在哪
  • ie标签页
  • linux系统中用户可以分为三种
  • linux使用su命令出错
  • windows 7磁盘
  • 怎么在ubuntu上编程
  • 家字取名男孩名字
  • win7菜单栏是什么
  • win8关闭uac
  • win10系统电脑关机自动重启
  • 贝塞尔曲线pr怎么用
  • option标签的作用
  • perl fileparse
  • dos命令怎么输入命令
  • 用python写网页
  • shell批量执行curl
  • bat批量创建文件夹及子文件夹
  • python怎么多进程
  • python找出n个数里最小的k个
  • android 布局属性大全
  • 怎么检查手机网络
  • 增值税申报表如何填报
  • 北京国税电子税务局
  • 进口设备如何交税
  • 税务税收预测
  • 香水与香精有啥不一样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设