16

连怎么避免内存逃逸都不知道?怎么进BAT?

 3 years ago
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.

AjiMjiI.png!mobile

问题

怎么避免 内存逃逸

怎么答

runtime/stubs.go:133 有个函数叫 noescapenoescape 可以在逃逸分析中 隐藏一个指针 。让这个指针在逃逸分析中 不会被检测为逃逸

u6zeiym.png!mobile

举例

  • 通过一个例子加深理解,接下来尝试下怎么通过 go build -gcflags=-m 查看逃逸的情况。

Ejq2qyz.png!mobile

执行 go build -gcflags=-m main.go
IJvQVz.png!mobile

其中主要看中间一小段

EV7ry2F.png!mobile

解释

  • 上段代码对 AATrick 同样的功能有两种实现:他们包含一个 string ,然后用 String() 方法返回这个字符串。但是从逃逸分析看 ATrick 版本没有逃逸。
  • noescape() 函数的作用是遮蔽输入和输出的依赖关系。使编译器不认为 p 会通过 x 逃逸, 因为 uintptr() 产生的引用是编译器无法理解的。
  • 内置的 uintptr 类型是一个真正的指针类型,但是在编译器层面,它只是一个存储一个 指针地址int 类型。代码的最后一行返回 unsafe.Pointer 也是一个 int
  • noescape()runtime 包中使用 unsafe.Pointer 的地方被大量使用。如果作者清楚被 unsafe.Pointer 引用的数据肯定不会被逃逸,但编译器却不知道的情况下,这是很有用的。
  • 面试中秀一秀是可以的 ,如果在实际项目中如果使用这种unsafe包大概率会被同事打死。 不建议使用! 毕竟包的名字就叫做 unsafe , 而且源码中的注释也写明了 USE CAREFULLY!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK