9.5.4 逃逸分析
遍历有向图
func (b *batch) walkAll() {
todo := make([]*location, 0, len(b.allLocs)+1)
enqueue := func(loc *location) {
if !loc.queued {
todo = append(todo, loc)
loc.queued = true
}
}
// 将所有的顶点压入队列
for _, loc := range b.allLocs {
enqueue(loc)
}
// 将代表堆地址的顶点压入队列
enqueue(&b.heapLoc)
var walkgen uint32
// 从队列尾部开始遍历队列,并调用方法 walkOne 对当前顶点进行分析
for len(todo) > 0 {
root := todo[len(todo)-1]
todo = todo[:len(todo)-1]
root.queued = false
walkgen++
b.walkOne(root, walkgen, enqueue)
}
}逃逸分析逻辑

示例分析

最后更新于