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

  • 360路由器手机怎么设置WiFi(360路由器手机怎么设置联网)

    360路由器手机怎么设置WiFi(360路由器手机怎么设置联网)

  • 酷狗闪光灯模式在哪设置(酷狗闪光灯模式怎么开启)

    酷狗闪光灯模式在哪设置(酷狗闪光灯模式怎么开启)

  • QQ主显账号如何关闭(qq主显账号是显示在哪里的)

    QQ主显账号如何关闭(qq主显账号是显示在哪里的)

  • 咪咕kindle不能调节亮度(kindle咪咕版操作说明)

    咪咕kindle不能调节亮度(kindle咪咕版操作说明)

  • 手机格式化了没有备份怎么办(手机格式化了没法激活怎么办)

    手机格式化了没有备份怎么办(手机格式化了没法激活怎么办)

  • 小米10x和10xpro区别(小米10x与10xpro区别)

    小米10x和10xpro区别(小米10x与10xpro区别)

  • k20突然不能快充了(k20p不能快充)

    k20突然不能快充了(k20p不能快充)

  • 计算器里面的M +和M- 是什么意思(计算器里面的M +和M- 是什么功能)

    计算器里面的M +和M- 是什么意思(计算器里面的M +和M- 是什么功能)

  • 连接被远程计算机终止是什么意思(连接被远程计算机终止win10)

    连接被远程计算机终止是什么意思(连接被远程计算机终止win10)

  • qq号双封是什么意思啊(qq双封是什么意思)

    qq号双封是什么意思啊(qq双封是什么意思)

  • 机械鼠标旁边的两个按键是干嘛的?(机械鼠标旁边的按钮)

    机械鼠标旁边的两个按键是干嘛的?(机械鼠标旁边的按钮)

  • 微信发不出去是被拉黑了吗(发错微信超过2分钟撤不回怎么办)

    微信发不出去是被拉黑了吗(发错微信超过2分钟撤不回怎么办)

  • vivox21支持5g网络吗(vivox21支持5g频段吗)

    vivox21支持5g网络吗(vivox21支持5g频段吗)

  • 微信公众号文章可以修改吗(微信公众号文章编辑器)

    微信公众号文章可以修改吗(微信公众号文章编辑器)

  • oppo手机强制恢复出厂(oppo手机强制恢复出厂设置后要激活怎么办)

    oppo手机强制恢复出厂(oppo手机强制恢复出厂设置后要激活怎么办)

  • i78750h很强吗(i78750h什么水平)

    i78750h很强吗(i78750h什么水平)

  • 监控对方微信是真的吗(监控对方微信聊天记录是真的吗)

    监控对方微信是真的吗(监控对方微信聊天记录是真的吗)

  • 苹果手机自动续费的要在哪里关闭(苹果手机自动续费怎么申请退款)

    苹果手机自动续费的要在哪里关闭(苹果手机自动续费怎么申请退款)

  • 怎么解除快手评论上限(怎么解除快手评论禁言)

    怎么解除快手评论上限(怎么解除快手评论禁言)

  • ipadpro截屏快捷键(ipad pro屏幕截图快捷键)

    ipadpro截屏快捷键(ipad pro屏幕截图快捷键)

  • 苹果xs显示电量百分比在哪(苹果xs显示电量百分比在哪调)

    苹果xs显示电量百分比在哪(苹果xs显示电量百分比在哪调)

  • 荣耀v20防水等级(荣耀20i防水等级)

    荣耀v20防水等级(荣耀20i防水等级)

  • 小米手环nfc用途(小米手环nfc用途是什么)

    小米手环nfc用途(小米手环nfc用途是什么)

  • 手环测睡眠的原理 (手环测睡眠的原理和作用)

    手环测睡眠的原理 (手环测睡眠的原理和作用)

  • 手机yy怎么下自己马甲(手机yy怎么下自己的频道马甲)

    手机yy怎么下自己马甲(手机yy怎么下自己的频道马甲)

  • 笔记本怎么加固态硬盘(笔记本怎么加固固态硬盘)

    笔记本怎么加固态硬盘(笔记本怎么加固固态硬盘)

  • 小规模纳税人升级一般纳税人流程
  • 税后净利润怎么算股价
  • 税法的分类都有什么
  • 小规模企业可以开6%的税票吗
  • 清卡抄税报税顺序
  • 财务报表是什么意思
  • 国际货运代理一个月大概有多少收入
  • 工资扣水电费怎么算
  • 出口的商品交消费税吗
  • 银行贷款受托支付后,钱怎么转回来
  • 计提社保费计入什么科目
  • 广告公司对外捐赠的会计处理怎么做?
  • 湖南残保金减免优惠政策2020
  • 机器设备的损耗属于什么会计科目类别
  • 同一地级行政区范围内举例
  • 公司购买地下停车位如何入账
  • 购车保险属于什么费用
  • 无法取得发票的预付账款如何处理
  • 企业的税收筹划
  • mac安装windows不能用键盘
  • c盘满了清理什么
  • 生产测试是指什么
  • 出口退税是怎么退
  • 公司注销账上有固定资产转给股东还要交税吗
  • enw是什么文件
  • 进项发票认证操作
  • pc应用是什么意思
  • PHP:mcrypt_enc_get_supported_key_sizes()的用法_Mcrypt函数
  • 小程序常见问题
  • 存货损失账务处理新规定
  • uni-app原理
  • 开发成本怎么做分录
  • web前端 css
  • rust 入门教程
  • 被收购方和被收购企业
  • 补缴去年的税款会计分录
  • 年末本年利润怎么结转
  • 交所得税怎么记账
  • 服务费减免税款怎么算
  • 增值税销项税红字应如何报税
  • 企业进行材料清查盘点中盘盈的材料
  • 生产企业免抵退红字冲减
  • 网上打印出来的手机买卖协议有效吗
  • 未确认融资费用账务处理
  • 员工工资是哪个会计科目
  • 公司注销前的资产负债
  • 白条该如何处理好
  • 固定资产的类别
  • 以前年度应付款少记怎么入账
  • 企业未按照规定报送年度报告怎么办
  • 工厂没给工人买社保我们应该找哪个部门
  • 实名汽车票抵扣
  • 劳务公司拿什么挣钱
  • 对外投资信息忘记填了
  • mysqldump -h
  • Windows Server 2008下Backup功能全通透
  • bios没有usb启动项解决方法联想
  • virtualbouncer.exe是什么进程
  • win7无法访问局域网电脑
  • igfxem是什么软件
  • ftpr
  • win8 设置
  • imac怎么查使用时间
  • 家字取名男孩名字
  • win8屏幕分辨率显示不全
  • win10桌面图标排列设置
  • linux用户登录
  • 关于减肥的好方法
  • jq判断浏览器
  • Python的flask框架教程
  • shell脚本中执行命令语句
  • jquery中的事件和事件处理有哪些
  • node爬取数据
  • python3 django教程
  • jquery网页
  • 陕西省国家税务局
  • 广西职称申报系统入口220
  • 如何填写财产申报表
  • 江苏灵活就业医保交多少年
  • 契税5年什么意思?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设