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

  • 成都成华区代理记账_兼职会计_费用低_会计兼职群(成都市成华区有哪些公司)

    成都成华区代理记账_兼职会计_费用低_会计兼职群(成都市成华区有哪些公司)

  • 切换听筒模式在哪里设置

    切换听筒模式在哪里设置

  • 粤康码怎么添加家庭成员(粤康码怎么添加成员)

    粤康码怎么添加家庭成员(粤康码怎么添加成员)

  • 快手极速版怎么自动播放下一个(快手极速版怎么领取平台作品奖励)

    快手极速版怎么自动播放下一个(快手极速版怎么领取平台作品奖励)

  • 手机清除数据是不是什么都没有了(手机清除数据是什么)

    手机清除数据是不是什么都没有了(手机清除数据是什么)

  • WPS长横线不间断怎么办(wps长横线不间断怎么办)

    WPS长横线不间断怎么办(wps长横线不间断怎么办)

  • 什么标记包含前面段落格式的信息(什么标记包含前面段落式的信息)

    什么标记包含前面段落格式的信息(什么标记包含前面段落式的信息)

  • 迈外迪wifi是免费的吗(迈外迪路由器设置教程)

    迈外迪wifi是免费的吗(迈外迪路由器设置教程)

  • 华为nova7没有呼吸灯怎么办(华为手机nova7为什么没有呼吸灯)

    华为nova7没有呼吸灯怎么办(华为手机nova7为什么没有呼吸灯)

  • 华为nova5pro桌面天气移除了怎么恢复(华为nova5pro桌面时间没有了怎么办)

    华为nova5pro桌面天气移除了怎么恢复(华为nova5pro桌面时间没有了怎么办)

  • WPS文档段前12磅怎么设置(wps段前12磅怎么设置)

    WPS文档段前12磅怎么设置(wps段前12磅怎么设置)

  • 电脑需要激活windows是什么意思(电脑需要激活windows需要多少费用)

    电脑需要激活windows是什么意思(电脑需要激活windows需要多少费用)

  • 手机开机卡住了怎么办(手机开不了机怎么办)

    手机开机卡住了怎么办(手机开不了机怎么办)

  • cat是指计算机的什么(cat计算机含义的什么?)

    cat是指计算机的什么(cat计算机含义的什么?)

  • 抖币可以送好友吗(抖音抖币可不可以送好友)

    抖币可以送好友吗(抖音抖币可不可以送好友)

  • 笔记本144hz是什么意思(笔记本144hz什么水平)

    笔记本144hz是什么意思(笔记本144hz什么水平)

  • ipv6多少位(IPv6多少位)

    ipv6多少位(IPv6多少位)

  • 对方微信号改了还能搜到吗(对方微信号改了还能监控到对方聊天记录吗)

    对方微信号改了还能搜到吗(对方微信号改了还能监控到对方聊天记录吗)

  • 淘宝在哪绑定身份证(淘宝哪里绑定身份证号码)

    淘宝在哪绑定身份证(淘宝哪里绑定身份证号码)

  • 荣耀20i怎么返回(荣耀20i返回键怎么调出来)

    荣耀20i怎么返回(荣耀20i返回键怎么调出来)

  • 抖音直播怎么设置禁言(抖音直播怎么设置心愿单)

    抖音直播怎么设置禁言(抖音直播怎么设置心愿单)

  • 计算机分栏栏宽在哪(计算机分栏最多分几栏)

    计算机分栏栏宽在哪(计算机分栏最多分几栏)

  • 云电脑充50可以用多久(云电脑充值会员可以无限玩游戏吗)

    云电脑充50可以用多久(云电脑充值会员可以无限玩游戏吗)

  • lf函数的用法(lf函数的用法excel判断条件怎么判断)

    lf函数的用法(lf函数的用法excel判断条件怎么判断)

  • 公司购买车辆的好处
  • 汽车增值税是企业交给国家的税
  • 税后营业利润和利润总额的区别
  • 哪些费用可以放到研发费用中
  • 经营活动现金流量公式
  • 计划成本法委托加工物资例题
  • 预收账款怎样清零
  • 房租收入如何缴税?
  • 从对公账户提取备用金违法吗
  • 制造费用折旧费怎么结转
  • 委托加工物资加工费怎么结转
  • 购车 买车
  • 非增值税纳税人有哪些
  • 内账和外账会计哪个简单
  • 建筑发票怎么抵税
  • 本期免税收入是什么
  • 加盟费需要缴纳多少税
  • 高速公路通行费抵扣最新规定
  • 小规模纳税人计提增值税账务处理
  • 外经证作废流程
  • 利润表里的其他业务利润怎么形成的
  • 暂停装修
  • 退还工会经费会退回吗
  • 收到上级工会下拨的工会经费
  • 工会经费会计分局
  • 冲减坏账准备和计提坏账准备
  • 收到生育津贴会计分录
  • 微软预购
  • 小规模纳税人多少钱不用交税
  • 如何区分货币财富和收入
  • 销售退回的账务处理附什么底稿
  • 最小的触屏手机有哪些
  • 菲律宾薄荷岛疫情最新消息
  • php的session和cookie实现登录
  • 销售折让销货方式有哪些
  • 报表中库存商品怎么填
  • 免收印花税
  • 建筑工地仓库管理流程
  • 基本户往一般户转钱有限制吗
  • 调账处理
  • 织梦文档网站模板
  • 浅谈php设计模式的理解
  • SQL Server FileStream详解
  • 计提工资的时候计提个税吗
  • 金税四期对建筑企业的影响
  • 企业所得税季末资产总额
  • 建筑公司计提企税怎么算
  • 购车增值税可以不交吗
  • mysql的主从
  • 兼职收入用缴纳增值税吗
  • 公司购烟酒怎么入账
  • 财产租赁合同印花税双方都要交吗
  • 年金一定是一年一次吗
  • 车间装修预算表
  • 本月增加的无形资产本月摊销
  • 广告发票能抵扣吗
  • 月末结转的各类凭证无需注意先后顺序
  • 应收账款和预收账款都是企业的债权
  • 业务员垫付保费
  • 发票遗失复印件可以入账吗
  • skydrive pro
  • linux服务端
  • linux临时目录在哪
  • 映泰主板bios设置内存频率
  • vrvarp.exe是什么
  • windows系统后台不显示QQ等软件(任务栏右侧不显示QQ图标)
  • 虚拟机ubuntu怎么用
  • linux系统简介
  • win7系统误删文件可以恢复吗
  • linux查看hz
  • win 10系统怎么查看网络连接
  • ie支持es6
  • 自定义图片制作软件
  • bgm背景
  • android 进程通信
  • jquery js区别
  • python类怎么用
  • 面向对象的程序设计语言是
  • 美国买东西邮寄怎么寄
  • 济南市土地使用税申报表怎样作废
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设