美文网首页
Go 语言逃逸分析(版本1.18.2)

Go 语言逃逸分析(版本1.18.2)

作者: Sun东辉 | 来源:发表于2022-05-15 10:25 被阅读0次

什么是逃逸分析?

逃逸分析(escape analysis)就是在程序编译阶段根据程序代码中的数据流,对代码中哪些变量需要在栈上分配,哪些变量需要在堆上分配进行静态分析的方法。一个理想的逃逸分析算法自然是能将那些人们认为需要分配在栈上的变量尽可能保留在栈上,尽可能少的“逃逸”到堆上的算法。

原理

两个原则:防止迷途指针。

  1. 栈对象的指针不能被分配到堆上;
  2. 栈对象的指针的生命周期,不能比栈对象的生命周期长;

数据流构建思路:AST树的静态数据流分析(static data-flow analysis)。

  1. 通过 AST 树构造一个有向加权图(权重 = 引用解析次数 - 取地址次数)。
  2. 遍历这个有向加权图,寻找可能违反上述两个原则的赋值路径。如果对象 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
}

```

实现

  1. 构造顶点 initFunc
    遍历所有函数的局部变量,检查变量的大小,大对象直接标记。
  2. 构造边 walkFunc
    对目标函数的所有语句递归遍历并进行分析,如果语句中存在赋值关系,则为其创建有向边。
  3. 分析有向加权图
    基于生命周期的判断 outlives
    基于权重的判断 walkOne
  4. 遍历顶点,收集被标记的的逃逸原因 walkAll
    编译器内部通过两个 LIFO Queue 来实现该双重循环。
    在遍历的过程中,会同步分析有向权图,即 for len(todo) > 0 {... b.walkOne(root, walkgen, enqueue)}

相关文章

  • Go 语言逃逸分析(版本1.18.2)

    什么是逃逸分析? 逃逸分析(escape analysis)就是在程序编译阶段根据程序代码中的数据流,对代码中哪些...

  • Go Gin 框架简单实现

    Go 版本:go version go1.18.2 darwin/amd64 Go 语言 Gin 框架主要包含七个...

  • golang内存逃逸

    一篇很好的博客: Go 语言机制之栈与指针 Go 语言机制之逃逸分析 Go 语言机制之内存剖析 Go 语言机制之数...

  • go语言 逃逸分析

    go语言逃逸分析 任何时候,一个值被分享到函数栈帧范围之外,它都会在堆上被重新分配,说道这个问题了,我们就谈谈帧边...

  • Go语言逃逸分析

    本贴转自https://www.cnblogs.com/itbsl/p/10476674.html[https:/...

  • GO语言变量逃逸分析

    引言 内存管理的灵活性是让C/C++程序猿们又爱又恨的东西,比如malloc或new一块内存我可以整个进程使用。但...

  • go 逃逸分析

    go 逃逸分析 什么是逃逸分析 逃逸分析决定一个变量是分配在堆上还是分配在栈上 原理 逃逸分析这种“骚操作”把变量...

  • (十三)golang 逃逸分析

    Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log。以下资料来自互联网,有错误之处,请一定告之...

  • Go语言的逃逸分析机制

    阅读前请悉知:本文是一篇翻译文章,出于对原文的喜爱与敬畏,所以需要强调:如果读者英文阅读能力好,请直接移步文末原文...

  • Go 语言机制之逃逸分析

    参考:https://www.cnblogs.com/shijingxiang/articles/12200355...

网友评论

      本文标题:Go 语言逃逸分析(版本1.18.2)

      本文链接:https://www.haomeiwen.com/subject/rcfuurtx.html