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

  • 怎样运用百科类站点推广网站?(百科怎么学)

    怎样运用百科类站点推广网站?(百科怎么学)

  • 抖音直播怎么看主播收到多少礼物(抖音直播怎么看直播)

    抖音直播怎么看主播收到多少礼物(抖音直播怎么看直播)

  • 苹果手机怎么查找手机位置在哪(苹果手机怎么查去过的轨迹)

    苹果手机怎么查找手机位置在哪(苹果手机怎么查去过的轨迹)

  • 红米手环有几种颜色呢(红米手环功能最全介绍)

    红米手环有几种颜色呢(红米手环功能最全介绍)

  • 钉钉怎样取消实名认证(钉钉怎么取消实人认证)

    钉钉怎样取消实名认证(钉钉怎么取消实人认证)

  • 收到短信没有提示音(收到短信没有提示怎么办?)

    收到短信没有提示音(收到短信没有提示怎么办?)

  • 蓝牙鼠标已连接但不可用(蓝牙鼠标已连接已配对来回切换)

    蓝牙鼠标已连接但不可用(蓝牙鼠标已连接已配对来回切换)

  • 腾讯会议后台运行老师能看见吗

    腾讯会议后台运行老师能看见吗

  • 华为手机密码保存箱在哪里(华为手机密码保险箱在哪里)

    华为手机密码保存箱在哪里(华为手机密码保险箱在哪里)

  • 微信新消息怎么不显示在手机屏幕上(微信新消息怎么设置不显示内容)

    微信新消息怎么不显示在手机屏幕上(微信新消息怎么设置不显示内容)

  • 抖音店铺怎么开通(2023抖音店铺怎么开)

    抖音店铺怎么开通(2023抖音店铺怎么开)

  • 怎样关闭实时热搜(关闭实时热点换一批)

    怎样关闭实时热搜(关闭实时热点换一批)

  • 抖音怎么开直播橱窗(抖音怎么开直播电视剧教程)

    抖音怎么开直播橱窗(抖音怎么开直播电视剧教程)

  • 苹果人工服务24小时吗(苹果人工服务24小时 在线客服电话转人工)

    苹果人工服务24小时吗(苹果人工服务24小时 在线客服电话转人工)

  • 苹果11por是双卡双待吗(苹果11por是双卡待机吗)

    苹果11por是双卡双待吗(苹果11por是双卡待机吗)

  • 拼多多用微信登录安全吗(拼多多用微信登录的账号怎么注销)

    拼多多用微信登录安全吗(拼多多用微信登录的账号怎么注销)

  • 快手超级管理员和管理员的区别(快手超级管理员有几个)

    快手超级管理员和管理员的区别(快手超级管理员有几个)

  • lndtl40华为什么型号(华为lnd_tl40多少钱)

    lndtl40华为什么型号(华为lnd_tl40多少钱)

  • vivos1电池容量多大(vivos1电池容量是多少)

    vivos1电池容量多大(vivos1电池容量是多少)

  • 华为已卸载的软件在哪里(华为已卸载的软件还在手机里面吗)

    华为已卸载的软件在哪里(华为已卸载的软件还在手机里面吗)

  • cad格式刷快捷键(中望cad格式刷快捷键)

    cad格式刷快捷键(中望cad格式刷快捷键)

  • HTML - 扫盲(htmlspecialchars_decode)

    HTML - 扫盲(htmlspecialchars_decode)

  • VUE浅拷贝和深拷贝(js浅拷贝和深拷贝的方法)

    VUE浅拷贝和深拷贝(js浅拷贝和深拷贝的方法)

  • 金税盘连接不上电脑是怎么回事
  • 企业持股分红
  • 成本结转不规范会受到什么罚款
  • 一般纳税人公司抵扣
  • 对公账户是不是实时到账
  • 处置可供出售金融资产取得的投资收益
  • 现金日记账是收付实现制吗
  • 税控服务费能抵扣吗
  • 物流运输途中损坏怎么办
  • 承包费收入如何交增值税
  • 建筑企业劳务分包税务筹划
  • 应收账款平均余额公式
  • 营业执照印花税是什么意思啊
  • 营改增个体工商户优惠政策
  • 旧税号的发票专用章还能使用吗
  • 甲公司采用租赁方式租入一台大型设备
  • 营改增后餐饮业税种
  • 职工教育经费列支范围及标准
  • 资产委托经营管理合同
  • 机票进项税额怎么申报
  • 个体户需要记账嘛
  • 红字信息表跨越可以撤销吗
  • 退货抵扣是什么意思
  • 预收账款长期挂账如何处理
  • 存货跌价准备借贷方表示的含义
  • 工程公司更换单位怎么办
  • 应收账款未计提坏账能直接核销
  • 获取url的参数有哪些方法
  • 借条无还款时间怎么办
  • php中??
  • 如何看待税收的本质
  • ccs是什么软件
  • 网赚项目——Youtube获取高流量的技巧
  • ant design vue vue3
  • 便秘怎么办 女性
  • 政府补助的会计处理分录
  • 发票金额与银行付款金额少几分钱
  • 二手房房屋买卖注意哪些问题
  • php代码大全及其含义
  • zend framework手册
  • php 解压缩
  • php7 nginx
  • thinkphp apidoc
  • 报销单跨月怎么记账
  • 企业印花税的申报
  • 企业的管理费用占比
  • mysqldump导入数据库
  • 公司的违约金
  • 小规模纳税人的企业所得税税率
  • 公司减少注册资本的条件和程序
  • 专票不抵扣认证怎么操作
  • 存货报废进项税转出吗
  • 结转以后年度抵免的境外所得税怎么进行会计处理
  • 销售奖金交税由谁承担
  • 收到工会经费如何处理
  • 不需要计提折旧的情况
  • 长期借款和长期贷款一样吗
  • 应付账款会计分录例题
  • win10禁用所有启动项
  • foxmail反应慢的原因
  • vista win
  • win8系统安装WPS
  • centos 安装
  • 如何知道自己的邮箱号
  • win10电脑打开图片文件夹会跳闪
  • centos搭建服务器
  • win7系统添加右键菜单在哪里设置
  • win8怎么改系统
  • linux系统安装驱动
  • 用jquery实现隔行变色
  • js函数预解析
  • Linux查看所有用户和密码
  • 手把手教怎么说
  • unity mobile3d
  • 使用jquery实现的项目
  • 地方电子税务局是干嘛的
  • 期初库存和期末库存是什么意思
  • 河南运输客票查询管理条例
  • 个体税务怎么查询
  • 艾地盟预混料怎么样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设