知识卡片
逃逸分析原则
内容
逃逸分析用静态数据流判断对象该放栈还是堆,核心约束是栈对象指针不能被堆长期保存,也不能超过栈对象生命周期。它把内存安全交给编译器,也决定 GC 压力。
参考来源
- 位置:《Go语言底层原理剖析》第1章《深入Go语言编译器》1.9节《逃逸分析》
- 结论依据:原文直接给出逃逸分析的两条分配原则——"指向栈上对象的指针不能被存储到堆中"和"指向栈上对象的指针不能超过该栈对象的生命周期",并说明 Go 通过对抽象语法树的静态数据流分析(构建带权重的有向图)来实现逃逸判断,因此可以推出本卡片"逃逸分析用静态数据流判断栈堆归属、核心约束是这两条原则"的结论。
- 原始内容:逃逸分析是Go语言中重要的优化阶段,用于标识变量内存应该被分配在栈区还是堆区……分配时,遵循以下两个原则:◎原则1:指向栈上对象的指针不能被存储到堆中◎原则2:指向栈上对象的指针不能超过该栈对象的生命周期。Go语言通过对抽象语法树的静态数据流分析(static data-flow analysis)来实现逃逸分析,这种方式构建了带权重的有向图。