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

微信扫一扫,分享到朋友圈

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

问题

怎么避免 内存逃逸

怎么答

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

举例

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

执行 go build -gcflags=-m main.go

其中主要看中间一小段

解释

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

微信扫一扫,分享到朋友圈

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

Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换

上一篇

美国疾控中心负责人:新冠疫苗明年4月前大范围上市

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友