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

  • vivox70怎么设置通话自动录音(vivox70怎么设置动态壁纸)

    vivox70怎么设置通话自动录音(vivox70怎么设置动态壁纸)

  • 淘宝会员中心怎么进入(淘宝会员中心怎么关闭)

    淘宝会员中心怎么进入(淘宝会员中心怎么关闭)

  • 怎么退出快手主播粉丝团(怎么退出快手主播的粉丝团群)

    怎么退出快手主播粉丝团(怎么退出快手主播的粉丝团群)

  • 成像鼓碳粉严重不足(成像鼓碳粉严重不足更换方法图解)

    成像鼓碳粉严重不足(成像鼓碳粉严重不足更换方法图解)

  • 剪映支持的视频格式(剪映支持视频升降调吗)

    剪映支持的视频格式(剪映支持视频升降调吗)

  • asf格式文件怎么打开(asf格式文件怎么打开 苹果手机)

    asf格式文件怎么打开(asf格式文件怎么打开 苹果手机)

  • 苹果手机隐藏的应用怎么移出来(苹果手机隐藏的相册怎么打开)

    苹果手机隐藏的应用怎么移出来(苹果手机隐藏的相册怎么打开)

  • g502hero和g502主宰者区别(g502hero和g502hero主宰者区别)

    g502hero和g502主宰者区别(g502hero和g502hero主宰者区别)

  • 从手机号能查出什么信息呢(从手机号能查出抖音号吗)

    从手机号能查出什么信息呢(从手机号能查出抖音号吗)

  • OPPO手机指令4636无效(OPPO手机指令集)

    OPPO手机指令4636无效(OPPO手机指令集)

  • 由于对方隐私设置你无法查看作品(由于对方隐私设置,你暂时无法关注他是被拉黑了吗)

    由于对方隐私设置你无法查看作品(由于对方隐私设置,你暂时无法关注他是被拉黑了吗)

  • 微信运动显示人数不全(微信运动显示人数)

    微信运动显示人数不全(微信运动显示人数)

  • 拉黑后还显示已送达吗(拉黑后显示已送达)

    拉黑后还显示已送达吗(拉黑后显示已送达)

  • 苹果手机删除的短信怎么找回来(苹果手机删除的app能恢复吗)

    苹果手机删除的短信怎么找回来(苹果手机删除的app能恢复吗)

  • 抖音移除粉丝别人看得见吗(抖音移除粉丝是不是就不在对方列表里了)

    抖音移除粉丝别人看得见吗(抖音移除粉丝是不是就不在对方列表里了)

  •  iphone5s能用移动4g吗(苹果5移动手机可以用电信卡吗)

    iphone5s能用移动4g吗(苹果5移动手机可以用电信卡吗)

  • 苹果ipad开机键在哪(苹果ipad开机键坏了)

    苹果ipad开机键在哪(苹果ipad开机键坏了)

  • 微信充值要手续费吗(微信充值要手续费还是提现要手续费)

    微信充值要手续费吗(微信充值要手续费还是提现要手续费)

  • 信号hd是什么意思(信号hd是什么意思,怎么关闭)

    信号hd是什么意思(信号hd是什么意思,怎么关闭)

  • 淘宝购物车能放多少天(淘宝购物车能放多少钱的东西)

    淘宝购物车能放多少天(淘宝购物车能放多少钱的东西)

  • 硬盘启动不了(steam下载到硬盘启动不了)

    硬盘启动不了(steam下载到硬盘启动不了)

  • 电脑显示一分钟后重启怎么办(电脑显示一分钟就黑屏)

    电脑显示一分钟后重启怎么办(电脑显示一分钟就黑屏)

  • 如何获得京豆(怎么获取京豆)

    如何获得京豆(怎么获取京豆)

  • Vue3【Vue路由概念、项目引入路由、集成Vue路由 、编程式导航、带参数的动态路由匹配 、嵌套路由、重定向和别名、命名视图、不同的历史模式​】(十)-全面详解(学习总结---从入门到深化)(vue路由的理解)

    Vue3【Vue路由概念、项目引入路由、集成Vue路由 、编程式导航、带参数的动态路由匹配 、嵌套路由、重定向和别名、命名视图、不同的历史模式​】(十)-全面详解(学习总结---从入门到深化)(vue路由的理解)

  • 核定征收企业所得税率是多少
  • 个体工商户应如何购买社会保险公积金
  • 企业所得税汇算清缴退税怎么做账
  • 增值税的纳税人是谁
  • 防火门属于固定式防火风格
  • 金蝶旗舰版的现金流量表怎么导出
  • 小规模纳税人建筑工程增值税税率
  • 普通发票作废影响额度吗
  • 个税申报 两种方式
  • 机动车销售统一专票可以抵扣进项税额吗
  • 工业企业电费出售会计分录怎么写?
  • 汇算清缴需要多久
  • 股权稀释需要交税吗
  • 不动产修理领用原材料账务处理?
  • 支付银行借款利息属于现金使用范围吗
  • 运输发票的税率分类
  • 支付的租金计入什么会计科目
  • 承兑贴息的会计分录
  • 股东增资印花税税目
  • 收到人民政府寄来的ems
  • 支付境外咨询费代扣代缴增值税
  • 发生的业务招待费属于什么科目
  • 穿越火线真人版宣传片
  • 什么是财政代管资金
  • 税法中的视同行为如何开具发票
  • 资产评估报告包括
  • php unit
  • 琼斯的大海怪
  • 广告费和业务宣传费15%还是30%
  • PHP:ftp_ssl_connect()的用法_FTP函数
  • 佛洛勒斯岛在哪里
  • PHP:mcrypt_enc_get_key_size()的用法_Mcrypt函数
  • 短期借款帐务处理
  • Vite + Vue3 +Vant4构建项目时,按需引入使用Toast组件,引用 showToast 时出现编译报错的解决方案
  • 收到无法支付的押金收入
  • java deep learning
  • 特卡波小镇旅游攻略
  • vue如何销毁页面
  • jquery版本
  • “Ninja is required to load C++ extensions”解决方案
  • vue父组件怎么调用子组件的方法
  • 【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”
  • 最新windows11安装要求
  • 机器学习——图像分类
  • 简单设置w11
  • python中datetime用法
  • 建筑保温材料出台了哪些限制政策
  • 财务管理中的折现率是指什么
  • 申报经营所得成绩怎么填
  • 用友t6模块
  • 机动车价外费用发票如何开具
  • 企业贷款利息可以开发票吗
  • 会务费什么企业可以开
  • SQL Server 2008 R2 超详细安装图文教程
  • 应收账款余额贷方
  • 收购少数股东权益是利好吗
  • 借银行存款贷预收账款是哪个凭证
  • 加计扣除是指什么意思
  • 服装厂做的都是什么产品
  • 应交税费中应交税金包含个税吗
  • 缴纳以前年度税金怎么做账
  • 收到是怎么写
  • linux系统中的用户分为哪几类
  • solaris 11.4
  • mac如何安装dmg软件
  • 太极越狱助手
  • win10系统怎么找到我的电脑
  • windows开始界面
  • linux怎么使用无线网卡
  • win8电脑怎么设置定时开机
  • windows8停止
  • 保证windows 7安装后正常使用的安装方法
  • css设置段落
  • python解析数据
  • 深入浅出python中文第二版pdf
  • node搭建项目
  • unity物体碰撞爆炸
  • Javascript & DHTML 实例编程(教程)DOM基础和基本API
  • 税服领花规范照片
  • 开票信息哪里查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设