16
连怎么避免内存逃逸都不知道?怎么进BAT?
source link: https://studygolang.com/articles/30851
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
问题
怎么避免 内存逃逸 ?
怎么答
在 runtime/stubs.go:133
有个函数叫 noescape
。 noescape
可以在逃逸分析中 隐藏一个指针 。让这个指针在逃逸分析中 不会被检测为逃逸 。
举例
- 通过一个例子加深理解,接下来尝试下怎么通过
go build -gcflags=-m
查看逃逸的情况。
执行 go build -gcflags=-m main.go
其中主要看中间一小段
解释
- 上段代码对
A
和ATrick
同样的功能有两种实现:他们包含一个string
,然后用String()
方法返回这个字符串。但是从逃逸分析看ATrick
版本没有逃逸。 -
noescape()
函数的作用是遮蔽输入和输出的依赖关系。使编译器不认为p
会通过x
逃逸, 因为uintptr()
产生的引用是编译器无法理解的。 - 内置的
uintptr
类型是一个真正的指针类型,但是在编译器层面,它只是一个存储一个指针地址
的int
类型。代码的最后一行返回unsafe.Pointer
也是一个int
。 -
noescape()
在runtime
包中使用unsafe.Pointer
的地方被大量使用。如果作者清楚被unsafe.Pointer
引用的数据肯定不会被逃逸,但编译器却不知道的情况下,这是很有用的。 - 面试中秀一秀是可以的 ,如果在实际项目中如果使用这种unsafe包大概率会被同事打死。 不建议使用! 毕竟包的名字就叫做
unsafe
, 而且源码中的注释也写明了USE CAREFULLY!
。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK