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

  • 股权转让交印花
  • 计算企业所得税分录
  • 资金账簿印花税每年都要交吗?
  • 公司有残疾人需要交税吗
  • 小型微利企业认定标准最新
  • 医药行业发票税率
  • 工资中代扣款是什么
  • 应付账款转营业外收入进项税转出
  • 房地产开发票的时间
  • 开票显示错误信息是怎么回事
  • 商业保险费可以在个人所得税税前扣除吗
  • 进项税未抵扣完怎么结转
  • 公司破产后资产怎么处理
  • 付给其他公司的利息怎么做账
  • 地产佣金收入属什么收入
  • 跨年成本发票红冲怎么做会计分录
  • 建筑业预征缴纳税款
  • 采购合同中含税金额
  • 劳务派遣劳务费发票怎么开
  • 分公司不独立核算需要开银行账户吗
  • 收到员工偿还的借款8000元,所生成的凭证会计分录
  • 接受政府无偿划拨固定资产税务处理
  • 最新消费税税目顺口溜
  • 怎么查询企业的注册资金
  • 兼营销售的销售额的确定
  • 所有者提取的借贷方向
  • 自建厂房转固定资产如何办理手续
  • 自定义输入是什么
  • 研发支出和研发费用是一个吗
  • mac如何连接2个airpods
  • win10专业版怎样连接wifi
  • cpu资源占用高怎么办
  • iphone8plus完美越狱
  • 电脑进程ace是什么
  • linux系统中文输入法切换不出来
  • php上传图片大小限制
  • 日落后的托莱多全景,西班牙 (© Frank Fischbach/Alamy)
  • 公允价值变动损益在利润表哪里
  • 企业支付宝账单明细怎么查
  • js获取各种屏幕信息
  • 增值税收范围
  • 工会经费的会计分录2022
  • 利润表中所得税费用为负数是什么意思
  • 资产总额是指营业收入和营业支出吗
  • 政府会计制度下基建账
  • 安全生产费实际发生
  • 电子承兑到期怎么收款
  • 材料的采购成本包括
  • 代扣代缴公积金现金流量
  • 公司部门财务单独核算
  • 房地产预缴税款主表怎么填
  • 材料的什么加上什么构成了材料的实际采购成本
  • 其他应收账款的会计分录
  • 溢价发行股票的交易费用
  • 管理费用和销售费用都有职工薪酬
  • 在岗职工平均工资在哪里查询
  • 应付工资的计算公式用友
  • 工作地变更社保卡怎么办
  • mysql触发事件
  • mysql压缩包安装教程8.0.20
  • mysql密码忘记怎么办
  • mac mysql密码忘记了怎么办
  • 苹果电脑连不上网络但是wifi正常
  • 微软在中国的代理公司
  • unity怎么输出文件
  • android游戏开发框架
  • perl删除文件夹
  • nodejs实战教程
  • js的定时器函数
  • 安卓百分百
  • 简要说明javascript的作用
  • 噩梦pv
  • 一个方便的世界作文
  • android程序崩溃会被重启
  • 电子税务局怎么申报
  • 3.0排量 车船税
  • 投资联营的房产税纳税人是谁
  • 最常见的财税知识
  • 南通工伤网上申请流程
  • 福州水费出账时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设