当前位置: 首页 > news >正文

由逃逸分析决定 --是什么意思?

Go 中“由逃逸分析决定”的意思

  • 核心概念:逃逸分析是编译器在编译期判断一个变量是否会“逃出”其作用域(函数栈帧)的过程。
    • 不逃逸 → 可以分配在栈上,函数返回时自动回收,效率更高。
    • 发生逃逸 → 必须分配在堆上,由 GC 回收。

什么时候会发生逃逸(常见场景)

  • 返回局部变量的指针/引用
    func f() *int { x := 1; return &x } // x 逃逸到堆
    
  • 在闭包/协程中捕获局部变量
    func f() func() { x := 1; return func() { _ = x } } // x 逃逸
    
  • 存入堆上存活更久的对象、全局变量、接口值、反射
  • 编译器无法证明生命周期不越界(保守起见放到堆)
  • 某些容器扩容导致元素迁移到堆(如 slice append 导致底层数组逃逸)

newmake 的关系

  • newmake 都只是“请求分配”;实际分配在栈还是堆由逃逸分析决定
    • 没逃逸:可能在栈上分配(即使是 new(T))。
    • 发生逃逸:在堆上分配(无论 new 还是 make)。

如何查看是否逃逸

  • 使用编译器诊断:
    • go build -gcflags="-m" .
    • go run -gcflags="-m" .
  • 输出中会有类似:
    • “moved to heap”
    • “escapes to heap”
    • “does not escape”

小结

  • 是否在堆/栈分配不是由你选择,而是编译器通过逃逸分析自动决定的
  • 优化建议:减少不必要的指针返回、避免把局部变量泄露到闭包/接口/全局环境,有助于降低逃逸与 GC 压力。
http://www.jsqmd.com/news/27983/

相关文章:

  • [笔记]CSP-S 2025 第二轮 Final Review
  • 阅读笔记三:以“工匠精神”打磨职业内核 - 20243867孙堃2405
  • 如何看懂explain工具信息,使用explain工具来分析索引
  • BLE-HCI浅学
  • 阅读笔记二:跳出技术陷阱,构建全局视野 - 20243867孙堃2405
  • 1837
  • 1067:整数的个数
  • 12233
  • Memory Profiler说明
  • 1272
  • 防火墙数据包转发流程--山石
  • mysql 如何查看sql语句执行时间和效率
  • 折腾笔记[34]-csharp打包依赖dll到单个dll
  • 《代码大全2》读后感二
  • 程序员修炼之道:跳出 “小工” 陷阱
  • Amped DVRConv与引擎更新38103:音频转视频容器与解码增强
  • 使用 Kotlin 结合 Tesseract OCR 识别验证码
  • 使用 Swift 结合 Tesseract OCR 解析验证码
  • 自律这一块儿
  • (Mutual) correlated agreement
  • AI元人文随想:当内心黑箱遇见技术黑箱
  • 如何基于区块链底层技术逻辑,反向用于 差别 AI生成与非AI生成内容
  • 2025.10.31总结
  • 电动车 NFC 学卡 All In One
  • 基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真
  • 基于Qlearning强化学习的Cart-Pole推车杆平衡控制系统matlab仿真
  • 绿源电动车 NFC 学卡 All In One
  • 洛谷 P8867 建造军营
  • 代码大全2阅读感悟2
  • 代码大全2阅读感悟3