什么是逃逸分析?
逃逸分析(escape analysis)就是在程序编译阶段根据程序代码中的数据流,对代码中哪些变量需要在栈上分配,哪些变量需要在堆上分配进行静态分析的方法。一个理想的逃逸分析算法自然是能将那些人们认为需要分配在栈上的变量尽可能保留在栈上,尽可能少的“逃逸”到堆上的算法。
原理
两个原则:防止迷途指针。
- 栈对象的指针不能被分配到堆上;
- 栈对象的指针的生命周期,不能比栈对象的生命周期长;
数据流构建思路:AST树的静态数据流分析(static data-flow analysis)。
- 通过 AST 树构造一个有向加权图(权重 = 引用解析次数 - 取地址次数)。
- 遍历这个有向加权图,寻找可能违反上述两个原则的赋值路径。如果对象 v 的地址存储在堆中或其他可能比它生命周期长的地方,那么对象 v 就被标记为需要分配到堆上。
数据结构
```go
// An escape holds state specific to a single function being analyzed
// within a batch.
type escape struct {
*batch
curfn *ir.Func // function being analyzed
labels map[*types.Sym]labelState // known labels
// loopDepth counts the current loop nesting depth within
// curfn. It increments within each "for" loop and at each
// label with a corresponding backwards "goto" (i.e.,
// unstructured loop).
loopDepth int
}
```
网友评论