游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

golang2021数据格式(88)Go语言变量逃逸分析

  在讨论变量生命周期之前,先来了解下计算机组成里两个非常重要的概念:堆和栈。
  什么是栈
  栈(Stack)是一种拥有特殊规则的线性表数据结构。
  1)概念
  栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,LastInFirstOut)的顺序,如下图所示。
  图:栈的操作及扩展
  往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部,最先放入的元素总是位于栈的底部。
  从栈中取出元素时,只能从栈顶部取出。取出元素后,栈的元素数量会变少。最先放入的元素总是最后被取出,最后放入的元素总是最先被取出。不允许从栈底获取数据,也不允许对栈成员(除了栈顶部的成员)进行任何查看和修改操作。
  栈的原理类似于将书籍一本一本地堆起来。书按顺序一本一本从顶部放入,要取书时只能从顶部一本一本取出。
  2)变量和栈有什么关系
  栈可用于内存分配,栈的分配和回收速度非常快。下面的代码展示了栈在内存分配上的作用:
  funccalc(a,bint)int{
  varcint
  cab
  varxint
  xc10
  returnx
  }
  代码说明如下:
  第1行,传入a、b两个整型参数。
  第2行,声明整型变量c,运行时,c会分配一段内存用以存储c的数值。
  第3行,将a和b相乘后赋值给c。
  第5行,声明整型变量x,x也会被分配一段内存。
  第6行,让c乘以10后赋值给变量x。
  第8行,返回x的值。
  上面的代码在没有任何优化的情况下,会进行变量c和x的分配过程。Go语言默认情况下会将c和x分配在栈上,这两个变量在calc()函数退出时就不再使用,函数结束时,保存c和x的栈内存再出栈释放内存,整个分配内存的过程通过栈的分配和回收都会非常迅速。
  什么是堆
  堆在内存分配中类似于往一个房间里摆放各种家具,家具的尺寸有大有小,分配内存时,需要找一块足够装下家具的空间再摆放家具。经过反复摆放和腾空家具后,房间里的空间会变得乱七八糟,此时再往这个空间里摆放家具会发现虽然有足够的空间,但各个空间分布在不同的区域,没有一段连续的空间来摆放家具。此时,内存分配器就需要对这些空间进行调整优化,如下图所示。
  图:堆的分配及空间
  堆分配内存和栈分配内存相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。
  变量逃逸(EscapeAnalysis)自动决定变量分配方式,提高运行效率
  堆和栈各有优缺点,该怎么在编程中处理这个问题呢?在CC语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。比如,函数局部变量尽量使用栈,全局变量、结构体成员使用堆分配等。程序员不得不花费很长的时间在不同的项目中学习、记忆这些概念并加以实践和使用。
  Go语言将这个过程整合到了编译器中,命名为变量逃逸分析。通过编译器分析代码的特征和代码的生命周期,决定应该使用堆还是栈来进行内存分配。
  1)逃逸分析
  通过下面的代码来展现Go语言如何使用命令行来分析变量逃逸,代码如下:
  packagemain
  importfmt
  本函数测试入口参数和返回值情况
  funcdummy(bint)int{
  声明一个变量c并赋值
  varcint
  cb
  returnc
  }
  空函数,什么也不做
  funcvoid(){
  }
  funcmain(){
  声明a变量并打印
  varaint
  调用void()函数
  void()
  打印a变量的值和dummy()函数返回
  fmt。Println(a,dummy(0))
  }
  代码说明如下:
  第6行,dummy()函数拥有一个参数,返回一个整型值,用来测试函数参数和返回值分析情况。
  第9行,声明变量c,用于演示函数临时变量通过函数返回值返回后的情况。
  第16行,这是一个空函数,测试没有任何参数函数的分析情况。
  第23行,在main()中声明变量a,测试main()中变量的分析情况。
  第26行,调用void()函数,没有返回值,测试void()调用后的分析情况。
  第29行,打印a和dummy(0)的返回值,测试函数返回值没有变量接收时的分析情况。
  接着使用如下命令行运行上面的代码:
  gorungcflagsmlmain。go
  使用gorun运行程序时,gcflags参数是编译参数。其中m表示进行内存分配分析,l表示避免程序内联,也就是避免进行程序优化。
  运行结果如下:
  commandlinearguments
  。main。go:29:13:aescapestoheap
  。main。go:29:22:dummy(0)escapestoheap
  。main。go:29:13:main。。。argumentdoesnotescape
  00
  程序运行结果分析如下:
  第2行告知代码的第29行的变量a逃逸到堆。
  第3行告知dummy(0)调用逃逸到堆。由于dummy()函数会返回一个整型值,这个值被fmt。Println使用后还是会在main()函数中继续存在。
  第4行,这句提示是默认的,可以忽略。
  上面例子中变量c是整型,其值通过dummy()的返回值逃出了dummy()函数。变量c的值被复制并作为dummy()函数的返回值返回,即使变量c在dummy()函数中分配的内存被释放,也不会影响main()中使用dummy()返回的值。变量c使用栈分配不会影响结果。
  2)取地址发生逃逸
  下面的例子使用结构体做数据,来了解结构体在堆上的分配情况,代码如下:
  packagemain
  importfmt
  声明空结构体测试结构体逃逸情况
  typeDatastruct{
  }
  funcdummy()Data{
  实例化c为Data类型
  varcData
  返回函数局部变量地址
  returnc
  }
  funcmain(){
  fmt。Println(dummy())
  }
  代码说明如下:
  第6行,声明一个空的结构体做结构体逃逸分析。
  第9行,将dummy()函数的返回值修改为Data指针类型。
  第11行,将变量c声明为Data类型,此时c的结构体为值类型。
  第14行,取函数局部变量c的地址并返回。
  第18行,打印dummy()函数的返回值。
  执行逃逸分析:
  gorungcflagsmlmain。go
  commandlinearguments
  。main。go:15:9:cescapestoheap
  。main。go:12:6:movedtoheap:c
  。main。go:20:19:dummy()escapestoheap
  。main。go:20:13:main。。。argumentdoesnotescape
  {}
  注意第4行出现了新的提示:将c移到堆中。这句话表示,Go编译器已经确认如果将变量c分配在栈上是无法保证程序最终结果的,如果这样做,dummy()函数的返回值将是一个不可预知的内存地址,这种情况一般是CC语言中容易犯错的地方,引用了一个函数局部变量的地址。
  Go语言最终选择将c的Data结构分配在堆上。然后由垃圾回收器去回收c的内存。
  3)原则
  在使用Go语言进行编程时,Go语言的设计者不希望开发者将精力放在内存应该分配在栈还是堆的问题上,编译器会自动帮助开发者完成这个纠结的选择,但变量逃逸分析也是需要了解的一个编译器技术,这个技术不仅用于Go语言,在Java等语言的编译器优化上也使用了类似的技术。
  编译器觉得变量应该分配在堆和栈上的原则是:
  变量是否被取地址;
  变量是否发生逃逸。

顺丰同城的挂顺丰同城一面打击外挂的同时还在自己制造外挂,在我们的城市最近出现一个顺丰同城的众包小队可以优先于众包20秒看单,众包晚于小队看单的同时还不会派单,但小队就不一样了可以先抢,我想……索尼定制耳机Justear推出蓝井艾露联名款,让聆听更贴合你几乎每一个人对音乐都有不同的感知与偏好,这是音乐流动的魅力所在。正是音频科技的力量使音乐的感染力得以跨越时空地传递。深耕音频行业数十年的索尼,对声学、对年轻人的聆听偏好有着独到……不到26岁就拥有百亿财富的V神有那么神奇吗?能一直神下去吗之前并不认识什么V神,所有冠之为神的人,其实在我眼里不过就是被普通人神话了的厉害的人而已,他们失去了平台或是丢掉了大势,也会狼狈逃窜的。不过作为杰出的人物,我还是非常赞同的,例……华为Mate系列还会不会出直面屏手机?感谢您的阅读!直面屏和曲面屏到底哪个屏幕更好?我觉得在很长时间被很多人讨论,直面屏手机更适合游戏体验,而曲面屏手机的外观设计更具有特性。全屏手机它因为采用了曲……自然界的动物有哪些自杀式的交配行为?大自然很神奇,总是会发生奇怪的事情。有时,可能是因为寻找伴侣会让人精疲力竭,以至于有的动物在遇到那个特别的另一半之后就会死去。这其实是大自然中普遍存在的自杀繁殖策略……想iPhone13降价?短期内不可能了苹果对于供应链的整合能力至少在同行业中,应该没有能与之匹敌的,由于苹果产品每年都有巨额销量,各路供应商都乐于搭上苹果这条线并为之供货,有的甚至是优先为苹果供货,放到具体产品上,……旧电脑如何装固态硬盘一个同事,觉得电脑启动太慢了,想装一个固态硬盘。我开始也没装过,我走过一些弯路,我开始以为把数据线和电源线连接好就可以了,然后没什么效果。因为这个不像装新电脑,从一开始装,开始……解除屏蔽网址链接不应讨价还价本网讯(记者张君成)保障合法的网址正常访问,是互联网发展的基本要求,无正当理由进行限制,严重影响了用户的体验,损害了用户的权益,扰乱了市场秩序。9月13日上午,工信部回应重点整……小屏旗舰不死!除了iPhone,用户还有小屏骁龙898手机可纵观这两年的手机,能称得上小屏旗舰的产品,恐怕也就只有苹果的iPhone系列了,上一代的iPhone12系列以及这一代的iPhone13系列,苹果都有mini这一型号。无论是芯……那些曾不被看好的数字货币比特币现如今哪怕你不关注数字货币,但也一定听说过比特币吧。那你了解比特币的前世今生吗?那你知道他曾经的发行是不被人们所看好的吗?今天我们就去了解了解比特币的传奇人生吧!比……智绿科技完成新一轮融资,由小米领投鞭牛士2月10日消息,据报道,新能源汽车电气系统供应商苏州智绿环保科技有限公司(以下简称智绿科技)宣布完成亿元新一轮融资。此轮融资由小米领投,涌铧投资、元禾控股、领军创投等机构……原创三迤新语共享单车当行有矩停有章作者戴先任近日,由北京市自行车电动车行业协会牵头,会同美团单车、哈啰单车、青桔单车3家共享单车运营企业,四方共同签署了《北京区域互联网租赁自行车行业规范用户停放行为联合限……
亚洲品牌哪家强?印度塔塔排第47,茅台排第36,华为只排第8此前,世界品牌实验室发布了一份亚洲500强排行榜,引起广泛的关注和讨论。据介绍,该榜单主要是根据亚洲各大品牌的影响力进行测评,共有21个国家和地区的500个品牌入选。从行业分布……确认!英伟达69亿美元拿下芯片商Mellanox,击败英特尔智东西(公众号:zhidxcom)文心缘智东西3月11日消息,英伟达官方宣布已经达成协议,以69亿美元现金收购以色列芯片商MellanoxTechnologies。这是英……什么是web3大家好,我是猫神财经,今天说说马斯克挑起的WEB3吧,首先大家要知道什么是web3,简单的解释就是实现上网去中心化,用户更有隐私性,元宇宙是塑造互联网甚至世界未来的概念之……3。8香港股市再度放量大跌,持仓亏至23,大概率继续下行3。7持仓港股基金亏4,3。8日继续大跌。去年互联网反垄断、取消税费优惠、用户发展见顶等消息叠加,港股互联网企业纷纷大跌,其中美团、小米、腾讯跌幅巨大,尤其是小米再度跌破……智赋数字胶东,树根带来中小企业转型解压良方今年是山东省落实区域协调发展、推动胶东经济圈一体化的开局之年。为助力胶东五市中小企业通过数字化手段紧抓工业4。0机遇、共同发展先进制造业,近日,在山东省工业和信息化厅的指导下,……2018年传媒业发展回顾与展望2018年,我国传媒业由量变进入质变,互联网媒体实质上已经主导传统传媒用户和广告市场,传统媒体通过机构大整合来应对挑战,字节跳动作为互联网的第四极开始挑战BAT巨头的地位。这些……餐具消毒流水线洗碗机餐具消毒清洁流水线,主要适用的领域在餐具饮具集中消毒中心,主要是消毒中心清洁,消毒陶瓷餐具并包装成品,分配到主要的餐厅,酒店,餐馆等都可以使用陶瓷套装餐具的地点。使用后,回收到……领克06全品牌最便宜,吉利架构领克外观,性价比很高出自BMA平台的领克06上市时间不长,但是受到的争议可不少。很多人说这款出自低端平台的车不过是吉利缤越的换壳车而已,然而价格却敢高出4万不止起售;然而,领克06的车主却不这么认……随身wifi怎么用?随身wifi怎么用随身wifi就是可以随身携带的wifi信号,通过无线移动路由器和无线运营商提供的无线上网芯片(sim卡),组成一个可以移动的wifi接收发射信号源。随身……热闻云南三姐弟上学途中意外身故,13年后父母仍在寻找真相极目新闻记者余渊至今,来自云南的邓率和申开英夫妇,仍在等待一个真相。13年前,他们在老家留守读书的三个孩子,在上学的途中离奇失踪,直到四天后才被人发现。警方出具的鉴……投资20亿元!vivo新智能制造中心启用,尽显一线大厂实力近日,vivo官方宣布,vivo新智能制造中心正式启用。vivo目前已经拥有了9大研发中心和5大制造中心,这95的搭配形成了从研发到生产的完整体系。而且对于拥有自有工厂的手机品……人工智能和物联网如何改变运输管理人工智能(AI)和物联网(IoT)都是尖端技术,正开始在我们周围的世界获得牵引力。财富商业洞察(FortuneBusinessInsight)指出,2019年全球人工智能市场规……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网