问题
怎么避免内存逃逸?
怎么答
在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!
。
文章推荐:
- 昨天那个在for循环里append元素的同事,今天还在么?
- golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?
- golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?
- golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
- golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?
- golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag?
- golang面试题:json包变量不加tag会怎么样?
- golang面试题:怎么避免内存逃逸?
- golang面试题:简单聊聊内存逃逸?
- golang面试题:字符串转成byte数组,会发生内存拷贝吗?
- golang面试题:翻转含有
中文、数字、英文字母
的字符串 - golang面试题:拷贝大切片一定比小切片代价大吗?
- golang面试题:能说说uintptr和unsafe.Pointer的区别吗?
如果你想每天学习一个知识点?
有疑问加站长微信联系(非本文作者)