Ezreal 书架 Ezreal 书架
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
  • 逃逸分析

    • 逃逸分析是什么
    • 逃逸分析有什么作用
    • 逃逸分析是怎么完成的
    • 如何确定是否发生逃逸
    • Go与其他语言的堆和栈是同一个概念吗
  • 延迟语句

  • 数据容器

  • 通道

  • 接口

  • unsafe

  • context

  • Go程序员面试笔试宝典
  • 逃逸分析
ezreal_rao
2023-04-23

逃逸分析是怎么完成的

Go 语言逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么这个变量就会发生逃逸。

编译器会分析代码的特征和代码的生命周期,Go 中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。

Go 语言里没有一个关键字或者函数可以直接让变量被编译器分配到堆上。相反,编译器通过分析代码来决定将变量分配到何处。

对一个变量取地址,可能会被分配到堆上。但是编译器进行逃逸分析后,如果考虑到在函数返回后,此变量不会被引用,那么还是会被分配到栈上。简单来说,编译器会根据变量是否被外部引用来决定是否逃逸:

1)如果变量在函数外部没有引用,则优先放到栈上。
2)如果变量在函数外部存在引用,则必定放到堆上。

针对第一条,放到堆上的情形:定义了一个很大的数组,需要申请的内存过大,超过了栈的存储能力。

#逃逸分析
上次更新: 5/9/2023, 10:58:32 AM
逃逸分析有什么作用
如何确定是否发生逃逸

← 逃逸分析有什么作用 如何确定是否发生逃逸→

最近更新
01
为什么我的MySQL会抖一下
07-15
02
HTTP 性能优化面面观
07-12
03
WebSocket:沙盒里的 TCP
07-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Ezreal Rao | CC BY-NC-SA 4.0
豫ICP备2023001810号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式