go 逃逸分析 翻译

翻译自
https://www.ardanlabs.com/blog/2018/01/escape-analysis-flaws.html

https://docs.google.com/document/d/1CxgUBPlx9iJzkz9JWkb6tIpTe5q32QDmz8l0BouG0Cw/edit#heading=h.tvvbikdq3so3

1 间接赋值

1)创建main,go,内容如下


package main

type X struct {
    p *int
}

func main() {

    for i := 0; i < 10; i++ {

        var i1 int

        x1 := &X{

            p: &i1,
        }

        _ = x1

        var i2 int

        x2 := &X{}

        x2.p = &i2

    }

}
  1. go build -gcflags '-m' main.go, 显示

./main.go:17:10: &i2 escapes to heap

./main.go:15:7: moved to heap: i2

./main.go:11:7: main &i1 does not escape

./main.go:11:4: main &X literal does not escape

./main.go:16:9: main &X literal does not escape

2 间接调用

1) 创建main,go,内容如下

package main

func main() {

    for i := 0; i < 10; i++ {

        var y1 int

        foo(&y1, 42)

        var y2 int

        func(p *int, x int) {

            *p = x

        }(&y2, 42)

        var y3 int

        p := foo

        p(&y3, 42)

    }

}

func foo(p *int, x int) {

    *p = x

}

2) go build -gcflags '-m' main.go, 显示


./main.go:19:6: can inline foo

./main.go:6:6: inlining call to foo

./main.go:9:3: can inline main.func1

./main.go:11:4: inlining call to main.func1

./main.go:19:10: foo p does not escape

./main.go:15:5: &y3 escapes to heap

./main.go:13:7: moved to heap: y3

./main.go:6:7: main &y1 does not escape

./main.go:11:5: main &y2 does not escape

3 slice和map 赋值

1) 创建main,go,内容如下

package main

func main() {

    for i := 0; i < 10; i++ {

        m := make(map[int]*int)

        var x1 int

        m[0] = &x1 // BAD: cause of x1 escape

        s := make([]*int, 1)

        var x2 int

        s[0] = &x2 // BAD: cause of x2 escape

    }

}

2) go build -gcflags '-m' main.go, 显示


./main.go:7:10: &x1 escapes to heap

./main.go:6:7: moved to heap: x1

./main.go:11:10: &x2 escapes to heap

./main.go:10:7: moved to heap: x2

./main.go:5:12: main make(map[int]*int) does not escape

./main.go:9:12: main make([]*int, 1) does not escape

4 interface

1) 创建main,go,内容如下


package main

type Iface interface {
    Method()
}

type X struct {
    name string
}

func (x X) Method() {}

func main() {

    for i := 0; i < 10; i++ {

        x1 := X{"bill"}

        var i1 Iface = x1

        var i2 Iface = &x1

        i1.Method() // BAD: cause copy of x1 to escape

        i2.Method() // BAD: cause x1 to escape

        x2 := X{"bill"}

        foo(x2)

        foo(&x2)

    }

}

func foo(i Iface) {

    i.Method() // BAD: cause value passed in to escape

}

2) go build -gcflags '-m' main.go, 显示


./main.go:11:6: can inline X.Method

./main.go:11:7: X.Method x does not escape

./main.go:28:10: leaking param: i

./main.go:16:7: x1 escapes to heap

./main.go:17:7: &x1 escapes to heap

./main.go:17:18: &x1 escapes to heap

./main.go:15:3: moved to heap: x1

./main.go:23:6: x2 escapes to heap

./main.go:24:7: &x2 escapes to heap

./main.go:24:7: &x2 escapes to heap

./main.go:22:3: moved to heap: x2

<autogenerated>:1: leaking param: .this

<autogenerated>:1: (*X).Method .this does not escape

5 未知

1) 创建main,go,内容如下

package main

import "bytes"

func main() {

    for i := 0; i < 10; i++ {

        var buf bytes.Buffer

        buf.Write([]byte{1})

        _ = buf.Bytes()

    }

}

2) go build -gcflags '-m' main.go, 显示


./main.go:9:16: inlining call to bytes.(*Buffer).Bytes

./main.go:8:6: buf escapes to heap

./main.go:7:7: moved to heap: buf

./main.go:8:19: main []byte literal does not escape

./main.go:9:10: main buf does not escape
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 23,942评论 5 18
  • 外面下了很大的雨,秋雨来了,以后就会越来越凉快吗? 什么时候和谁去远走高飞啊? 金志文是个很有才的歌手~ 喜欢,笔芯。
    为独行找个借口阅读 90评论 0 0
  • 粗茶真味阅读 374评论 1 1
  • 财富是什么? 有人说财富是有很多很多的钱,也有人说财富是金钱和和精神的总和,还有人说财富是能量。 这一切都对,没有...
    画布坊阅读 606评论 4 1