教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 连怎么避免内存逃逸都不知道?怎么进BAT?

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

发布时间:2022-03-01   编辑:jiaochengji.com
教程集为您提供连怎么避免内存逃逸都不知道?怎么进BAT?等资源,欢迎您收藏本站,我们将为您提供最新的连怎么避免内存逃逸都不知道?怎么进BAT?资源

<span class="img-wrap"></span>

<h2>问题</h2>

怎么避免内存逃逸

<h2>怎么答</h2>

在<code>runtime/stubs.go:133</code>有个函数叫<code>noescape</code>。<code>noescape</code>可以在逃逸分析中隐藏一个指针。让这个指针在逃逸分析中不会被检测为逃逸
<span class="img-wrap"></span>

<h2>举例</h2><ul><li>通过一个例子加深理解,接下来尝试下怎么通过 <code>go build -gcflags=-m</code> 查看逃逸的情况。</li></ul>

<span class="img-wrap"></span>

执行<code>go build -gcflags=-m main.go</code>
<span class="img-wrap"></span>

其中主要看中间一小段
<span class="img-wrap"></span>

<h2>解释</h2><ul><li>上段代码对<code>A</code>和<code>ATrick</code>同样的功能有两种实现:他们包含一个 <code>string</code> ,然后用 <code>String()</code> 方法返回这个字符串。但是从逃逸分析看<code>ATrick</code> 版本没有逃逸。</li><li><code>noescape()</code> 函数的作用是遮蔽输入和输出的依赖关系。使编译器不认为 <code>p</code> 会通过 <code>x</code> 逃逸, 因为 <code>uintptr()</code> 产生的引用是编译器无法理解的。</li><li>内置的 <code>uintptr</code> 类型是一个真正的指针类型,但是在编译器层面,它只是一个存储一个 <code>指针地址</code> 的 <code>int</code> 类型。代码的最后一行返回 <code>unsafe.Pointer</code> 也是一个 <code>int</code>。</li><li><code>noescape()</code> 在 <code>runtime</code> 包中使用 <code>unsafe.Pointer</code> 的地方被大量使用。如果作者清楚被 <code>unsafe.Pointer</code> 引用的数据肯定不会被逃逸,但编译器却不知道的情况下,这是很有用的。</li><li>面试中秀一秀是可以的,如果在实际项目中如果使用这种unsafe包大概率会被同事打死。不建议使用! 毕竟包的名字就叫做 <code>unsafe</code>, 而且源码中的注释也写明了 <code>USE CAREFULLY! </code>。</li></ul><h2>文章推荐:</h2><ul><li>昨天那个在for循环里append元素的同事,今天还在么?</li><li>golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?</li><li>golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?</li><li>golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?</li><li>golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?</li><li>golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag?</li><li>golang面试题:json包变量不加tag会怎么样?</li><li>golang面试题:怎么避免内存逃逸?</li><li>golang面试题:简单聊聊内存逃逸?</li><li>golang面试题:字符串转成byte数组,会发生内存拷贝吗?</li><li>golang面试题:翻转含有<code>中文、数字、英文字母</code>的字符串</li><li>golang面试题:拷贝大切片一定比小切片代价大吗?</li><li>golang面试题:能说说uintptr和unsafe.Pointer的区别吗?</li></ul><h6>如果你想每天学习一个知识点?</h6>

<span class="img-wrap"></span>

到此这篇关于“ 连怎么避免内存逃逸都不知道?怎么进BAT?”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
连怎么避免内存逃逸都不知道?怎么进BAT?
golang 日志分析_Golang 内存分配之逃逸分析
golang byte转string_golang面试题:怎么避免内存逃逸?
连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了
详解Go逃逸分析
go 手动释放内存_Go语言-逃逸分析
【golang】逃逸分析
bytebuffer怎么转成string_golang面试题:怎么避免内存逃逸?
golang 的GC原理
golang 切片包含_golang面试题:怎么避免内存逃逸?

[关闭]
~ ~