教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go面试3(内存对齐)

go面试3(内存对齐)

发布时间:2021-12-12   编辑:jiaochengji.com
教程集为您提供go面试3(内存对齐)等资源,欢迎您收藏本站,我们将为您提供最新的go面试3(内存对齐)资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>go面试3(内存对齐)</h2>

版权声明: 本文为 InfoQ 作者【PONPON】的原创文章。

原文链接:【https://xie.infoq.cn/article/594a7f54c639accb53796cfc7】。

本文是在拜读原文后,将原文出现的面试题加入自己的思考,做了一些转变,也补充了自己一些疑惑,剩余的知识点和原理跟原文一致,原文作者的编程思想之深令人佩服,深究语言源码的精神值得学习。

<h3>
一、面试题</h3> <pre><code class="lang-go hljs"><span class="token keyword">type</span> S <span class="token keyword">struct</span> <span class="token punctuation">{</span> A <span class="token builtin">uint8</span> B <span class="token builtin">uint32</span> C <span class="token builtin">int16</span> D <span class="token builtin">int64</span> E <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token builtin">string</span> F <span class="token keyword">struct</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

上面结构体所占内存是多少?(cpu为64位)

<pre><code class="lang-go hljs">fun <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>B<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 4</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>C<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 8</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>D<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 16</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>E<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 24</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>F<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 56</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>F<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 0</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>S<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 64</span> <span class="token punctuation">}</span> </code></pre> <h3>
二、分析</h3> <pre><code>该面试题考察goland的<内存对齐>,从S的结构上看是8bytes对齐的,一般的回答可能是56bytes,因为从打印的S.F的偏移量看,是56byte,并且S.E的大小是0,但是最终的S却是64,所以必然有隐性的8bytes的padding, 为什么有这个padding,github上的大佬给出的解释是:"结构体尾部的size为0的变量(字段)会被分配内存空间进行填充, 如果不这么处理,改变量(字段)指针将会指向一个非法的内存空间,类似c/c 的野指针" </code></pre> <h3>三、原理</h3> <h4>1、术语</h4> <ul><li>

字(word):

是用于表示其自然的数据单位,也叫<code>machine word</code>。字是电脑用来一次性处理事务的一个固定长度。

</li><li>

字长:

一个字的位数,现代电脑的字长通常为 16、32、64 位。(一般 N 位系统的字长是 <code>N/8</code> 字节。)

</li></ul><h4>
2. 为什么要对齐</h4>

操作系统并非一个字节一个字节访问内存,而是按<code>2, 4, 8</code>这样的字长来访问。因此,当CPU从存储器读数据到寄存器,或者从寄存器写数据到存储器,IO的数据长度通常是字长。如 32 位系统访问粒度是 4 字节(bytes),64 位系统的是 8 字节。

当被访问的数据长度为 <code>n</code> 字节且该数据地址为<code>n</code>字节对齐,那么操作系统就可以高效地一次定位到数据,无需多次读取、处理对齐运算等额外操作。

<code>数据结构应该尽可能地在自然边界上对齐。如果访问未对齐的内存,CPU需要做两次内存访问。</code>

<h4>
3、数据结构对齐</h4>

对于go数据类型的大小保证和对齐保证,官方文档如下图

翻译圈红的内容:如果结构或数组类型包含大小为零的字段(或元素),则其大小为零。 两个不同的零大小变量在内存中可能具有相同的地址。

<h4>
<code>大小保证</code></h4>

在go中,如果两个值的类型为同一种类的类型,并且他们的类型的种类不为<code>接口</code>,<code>数组</code>和<code>结构体</code>,则这连个值的尺寸总是相等的

目前(go1.14),至少对于官方标准编译器来说,任何一个特定类型的所有值的尺寸都是相等的,所以我们也常说一个值的尺寸为此值的<code>类型的尺寸</code>

下表列出了各种种类的类型的尺寸(对标准编译器1.14来说):

一个结构体类型的尺寸取决于它的各个字段的类型尺寸和这些字段的排列顺序,为了程序执行性能,编译器需要保证某些类型的值在内存中存放时必须满足<code>特定的内存地址对齐要求</code>。地址对齐可能会造成相邻的两个字段之间在内存中被插入填充一些多余的字节,所以,一个结构体类型的尺寸比定不小于(常常会大于)此结构体类型的各个字段的类型尺寸之和。

一个数组类型的尺寸取决于它的元素类型的尺寸和它的长度,它的尺寸为它的元素类型的尺寸和它的长度的乘积。

Struct{}和[0]T{}的大小为0;不同类型的大小为0的变量可能指向同一快地址。

<h4>
<code>对齐保证</code></h4>

官方文档中的对齐保证的要求只有如下解释谷歌翻译结果:(原文就是圈红部分的上面的三条)

<ol><li>对于任何类型的变量x,unsafe.Alignof(x)的结果最小为1;</li><li>对于结构类型的变量x:对于x的每个字段f,unsafe.Alignof(x)是所有值unsafe.Alignof(x.f)中的最大值,但至少为1。</li><li>对于数组类型的变量x:unsafe.Alignof(x)与数组元素类型的变量的对齐方式相同</li></ol>

类型对齐保证也称为<code>值地址对齐保证</code>。如果一个类型T的对齐保证为N(一个正整数),则在运行时刻T类型的每个(可寻址的)值的地址都是N的倍数。我们也可以说类型T的值的地址保证为N字节对齐的。

事实上,每个类型有两个对齐保证,当它被用作结构体类型的字段类型时的对齐保证为次类型的字段对齐保证,其他情形的对齐保证称为此类型的一般对齐保证

对于一个类型T,我们可以调用unsafe.Alignof(t)来获得它的一般对齐保证,其中t为一个T类型的非字段值,也可以调用unsafe.Alignof(x.t)来获取T的字段对齐摆正,其中X为一个结构体质并且t为一个类型为T的结构体字段值。

在运行时刻,对于类型为T的一个值t,我们可以调用reflect.Typeof(t).Align()来获得类型T的一般对齐保证,也可以调用reflect.TypeOf(t).FieldAlign()来获得T的字段对齐保证

对于当前的官方go编译器(1.14版本),一个类型的一般对齐保证和字段对齐保证总是相等的。

<h4>
<code>重排优化</code></h4>

针对开头的面试体进行优化,减少内存占用

<pre><code class="lang-go hljs"><span class="token keyword">type</span> S1 <span class="token keyword">struct</span> <span class="token punctuation">{</span> A <span class="token builtin">uint8</span> <span class="token comment">// 1 补3为4</span> B <span class="token builtin">uint32</span> <span class="token comment">// 4 A B=8</span> C <span class="token builtin">int16</span> <span class="token comment">//2 补6为8</span> D <span class="token builtin">int64</span> <span class="token comment">//8</span> E <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token comment">// 16*2=32 </span> F <span class="token keyword">struct</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token comment">//8</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> S2 <span class="token keyword">struct</span> <span class="token punctuation">{</span> A <span class="token builtin">uint8</span> <span class="token comment">// 1 补1为2</span> B <span class="token builtin">int16</span> <span class="token comment">//2 </span> C <span class="token builtin">uint32</span> <span class="token comment">//4 A B C=8</span> D <span class="token keyword">struct</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token comment">// 0</span> E <span class="token builtin">int64</span> <span class="token comment">// 8</span> F <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token comment">// 16*2</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"S2 sizeof: %d,alignof:%d\n"</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>S2<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Alignof</span><span class="token punctuation">(</span>Sc<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"S1 sizeof: %d,alignof:%d\n"</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>S1<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Alignof</span><span class="token punctuation">(</span>Sb<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">/* S2 sizeof: 48,alignof:8 S1 sizeof: 64,alignof:8 */</span> </code></pre>

分析:S1和S2内字段的最大的都是int64,大小伟8bytes,对齐按机器字确定,64位下位 8Bytes,所以按8Bytes对齐

<code>合理重排字段可以减少填充,是struct字段排列更紧密</code>

<h4>
<code>零大小字段对齐</code></h4>

零大小字段(zero size field)是指struct{},大小为0,按理作为字段时不需要对齐,但当在作为结构体最后一个字段(final field)时需要对齐的。即开头的面试题,架设有指针指向这个final zero field,返回的地址将在结构体之外(即指向了别的内存),如果此指针一直存活不释放对应的内存,就会有内存泄漏的问题(该内存不因结构体释放而释放),go会对这种finam zero field也做填充,使之对齐。当然,有一种情况不需要对这个final zero field做额外填充,也就是这个末尾的上一个字段对齐,需要对这个字段进行填充时,final zero field就不需要再次填充,而是直接利用上一个字段的填充

<pre><code class="lang-go hljs"> <span class="token keyword">type</span> Sa <span class="token keyword">struct</span> <span class="token punctuation">{</span> <span class="token comment">//24</span> A <span class="token builtin">uint64</span> <span class="token comment">//8</span> B <span class="token builtin">uint32</span> <span class="token comment">//4</span> C <span class="token builtin">int32</span> <span class="token comment">//4</span> D <span class="token builtin">int8</span> <span class="token comment">//1</span> E <span class="token keyword">struct</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"Sa sizeof: %d,alignof:%d\n"</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>Sa<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Alignof</span><span class="token punctuation">(</span>Sa<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 假如这个 E 不是struct{},而是 [0]int32 或者 [0]int64,那 unsafe.Sizeof(S{}) 会是多少呢? </span> <span class="token comment">// 大小不变</span> </code></pre> <h3>
四、总结</h3> <ul><li>内存对齐是为了让cpu更高效的访问内存中的数据</li><li>struct的对齐是:如果类型t的对齐保证是n,那么类型t的每个值的地址在运行时必须是n的倍数</li><li>struct内字段如果填充过多,可以尝试重排,使字段排列更紧密,减少内存浪费</li><li>零大小字段要避免作为struct最后一个字段,会有内存浪费</li><li>32位系统上对64位字的原子访问要保证其是8bytes对齐的;当让如果不必要的话,还是用加锁(mutex)的方式更清晰简单</li></ul><h3>五、面试题拓展</h3> <pre><code class="lang-go hljs"><span class="token comment">// 连续声明两个Sa的变量s1,s2,那么s2的内存地址是怎样的?</span> <span class="token keyword">type</span> Sa <span class="token keyword">struct</span> <span class="token punctuation">{</span> <span class="token comment">//24</span> A <span class="token builtin">uint64</span> <span class="token comment">//8</span> B <span class="token builtin">uint32</span> <span class="token comment">//4</span> C <span class="token builtin">int32</span> <span class="token comment">//4</span> D <span class="token builtin">int8</span> <span class="token comment">//1</span> E <span class="token keyword">struct</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> s1<span class="token punctuation">,</span>s2 Sa fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"S1.E offsetof:%d,s1.E sizeof:%d, s1 sizeof:%d, s1.A address:%v"</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>s1<span class="token punctuation">.</span>E<span class="token punctuation">)</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>s1<span class="token punctuation">.</span>E<span class="token punctuation">)</span><span class="token punctuation">,</span>unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">&</span>s1<span class="token punctuation">.</span>A<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"S1.E offsetof:%d,s1.E sizeof:%d, s1 sizeof:%d, s1.A address:%v\n"</span><span class="token punctuation">,</span> unsafe<span class="token punctuation">.</span><span class="token function">Offsetof</span><span class="token punctuation">(</span>s2<span class="token punctuation">.</span>E<span class="token punctuation">)</span><span class="token punctuation">,</span> unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>s2<span class="token punctuation">.</span>E<span class="token punctuation">)</span><span class="token punctuation">,</span> unsafe<span class="token punctuation">.</span><span class="token function">Sizeof</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">&</span>s2<span class="token punctuation">.</span>A<span class="token punctuation">)</span> ptr1 <span class="token operator">:=</span> <span class="token function">uintptr</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Pointer</span><span class="token punctuation">(</span><span class="token operator">&</span>s1<span class="token punctuation">)</span><span class="token punctuation">)</span> ptr2 <span class="token operator">:=</span> <span class="token function">uintptr</span><span class="token punctuation">(</span>unsafe<span class="token punctuation">.</span><span class="token function">Pointer</span><span class="token punctuation">(</span><span class="token operator">&</span>s2<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>ptr2<span class="token operator">-</span>ptr1<span class="token punctuation">)</span> <span class="token comment">//32</span> <span class="token comment">/* S1.E offsetof:17,s1.E sizeof:0, s1 sizeof:24, s1.A address:0x11a6cd0 S1.E offsetof:17,s1.E sizeof:0, s1 sizeof:24, s1.A address:0x11a6cf0 */</span> </code></pre>

因为s1和s2在内存上是连续的,我们也知道s1的内存是24,那么问什么s2的地址相对s1的地址偏移量却是32呢?(0x11a6cf0-0x11a6cd0=32)

<code>原因是</code>:

<pre><code class="lang-bash hljs">因为对于s1这个对象,它的大小是24bytes,而go在内存分配时,会冲span种拿大于或等于40的最小的span中的一个快给这个对象,二sizeclass中这个快的大小值为32,所以虽然s1的大小是24bytes,但是实际分配给这个对象的内存大小是48 </code></pre> <h3>
补充知识点:</h3>

go的内存分配,首先是按照<code>sizeclass</code>划分span,然后每个span中的<code>page</code>又分成一个个小格子(大小相同的对象<code>object</code>)

<code>span</code>是golang内存管理的基本单位,是由一片连续的<code>8kb</code>(golfing <code>page</code>的大小)的页组成的大块内存

如图,<code>span</code>由一组连续的页组成,按照一定大小划分成<code>object</code>

每个<code>span</code>管理指定规格(golang中的page为单位)的内存快,内存池分配出不同规格的内存快就是通过span体现出来的,应用程序创建对象就是通过找到对应规格的<code>span</code>来存储的,下面是<code>mspan</code>结构中的主要部分。

<pre><code class="lang-go hljs"><span class="token keyword">type</span> mspan <span class="token keyword">struct</span> <span class="token punctuation">{</span> next <span class="token operator">*</span>mspan <span class="token comment">// next span in list, or nil if none</span> prev <span class="token operator">*</span>mspan <span class="token comment">// previous span in list, or nil if none</span> list <span class="token operator">*</span>mSpanList <span class="token comment">// For debugging. TODO: Remove.</span> startAddr <span class="token builtin">uintptr</span> <span class="token comment">// address of first byte of span aka s.base()</span> npages <span class="token builtin">uintptr</span> <span class="token comment">// number of pages in span</span> manualFreeList gclinkptr <span class="token comment">// list of free objects in mSpanManual spans</span> freeindex <span class="token builtin">uintptr</span> nelems <span class="token builtin">uintptr</span> <span class="token comment">// number of object in the span.</span> allocCache <span class="token builtin">uint64</span> allocBits <span class="token operator">*</span>gcBits gcmarkBits <span class="token operator">*</span>gcBits sweepgen <span class="token builtin">uint32</span> divMul <span class="token builtin">uint16</span> <span class="token comment">// for divide by elemsize - divMagic.mul</span> baseMask <span class="token builtin">uint16</span> <span class="token comment">// if non-0, elemsize is a power of 2, & this will get object allocation base</span> allocCount <span class="token builtin">uint16</span> <span class="token comment">// number of allocated objects</span> spanclass spanClass <span class="token comment">// size class and noscan (uint8)</span> state mSpanStateBox <span class="token comment">// mSpanInUse etc; accessed atomically (get/set methods)</span> needzero <span class="token builtin">uint8</span> <span class="token comment">// needs to be zeroed before allocation</span> divShift <span class="token builtin">uint8</span> <span class="token comment">// for divide by elemsize - divMagic.shift</span> divShift2 <span class="token builtin">uint8</span> <span class="token comment">// for divide by elemsize - divMagic.shift2</span> elemsize <span class="token builtin">uintptr</span> <span class="token comment">// computed from sizeclass or from npages</span> limit <span class="token builtin">uintptr</span> <span class="token comment">// end of data in span</span> speciallock mutex <span class="token comment">// guards specials list</span> specials <span class="token operator">*</span>special <span class="token comment">// linked list of special records sorted by offset.</span> <span class="token punctuation">}</span> </code></pre>

那么要想区分不同规格的<code>span</code>,必须要有一个标识,每个<code>span</code>通过<code>spanclass</code>标识属于哪种规格的<code>span</code>,golang的<code>span</code>规格一共有67种,具体如下

<pre><code class="lang-go hljs"><span class="token comment">// Code generated by mksizeclasses.go; DO NOT EDIT.</span> <span class="token comment">//go:generate go run mksizeclasses.go</span> <span class="token keyword">package</span> runtime <span class="token comment">// class bytes/obj bytes/span objects tail waste max waste</span> <span class="token comment">// 1 8 8192 1024 0 87.50%</span> <span class="token comment">// 2 16 8192 512 0 43.75%</span> <span class="token comment">// 3 32 8192 256 0 46.88%</span> <span class="token comment">// 4 48 8192 170 32 31.52%</span> <span class="token comment">// 5 64 8192 128 0 23.44%</span> <span class="token comment">// 6 80 8192 102 32 19.07%</span> <span class="token comment">// 7 96 8192 85 32 15.95%</span> <span class="token comment">// 8 112 8192 73 16 13.56%</span> <span class="token comment">// 9 128 8192 64 0 11.72%</span> <span class="token comment">// 10 144 8192 56 128 11.82%</span> <span class="token comment">// 11 160 8192 51 32 9.73%</span> <span class="token comment">// 12 176 8192 46 96 9.59%</span> <span class="token comment">// 13 192 8192 42 128 9.25%</span> <span class="token comment">// 14 208 8192 39 80 8.12%</span> <span class="token comment">// 15 224 8192 36 128 8.15%</span> <span class="token comment">// 16 240 8192 34 32 6.62%</span> <span class="token comment">// 17 256 8192 32 0 5.86%</span> <span class="token comment">// 18 288 8192 28 128 12.16%</span> <span class="token comment">// 19 320 8192 25 192 11.80%</span> <span class="token comment">// 20 352 8192 23 96 9.88%</span> <span class="token comment">// 21 384 8192 21 128 9.51%</span> <span class="token comment">// 22 416 8192 19 288 10.71%</span> <span class="token comment">// 23 448 8192 18 128 8.37%</span> <span class="token comment">// 24 480 8192 17 32 6.82%</span> <span class="token comment">// 25 512 8192 16 0 6.05%</span> <span class="token comment">// 26 576 8192 14 128 12.33%</span> <span class="token comment">// 27 640 8192 12 512 15.48%</span> <span class="token comment">// 28 704 8192 11 448 13.93%</span> <span class="token comment">// 29 768 8192 10 512 13.94%</span> <span class="token comment">// 30 896 8192 9 128 15.52%</span> <span class="token comment">// 31 1024 8192 8 0 12.40%</span> <span class="token comment">// 32 1152 8192 7 128 12.41%</span> <span class="token comment">// 33 1280 8192 6 512 15.55%</span> <span class="token comment">// 34 1408 16384 11 896 14.00%</span> <span class="token comment">// 35 1536 8192 5 512 14.00%</span> <span class="token comment">// 36 1792 16384 9 256 15.57%</span> <span class="token comment">// 37 2048 8192 4 0 12.45%</span> <span class="token comment">// 38 2304 16384 7 256 12.46%</span> <span class="token comment">// 39 2688 8192 3 128 15.59%</span> <span class="token comment">// 40 3072 24576 8 0 12.47%</span> <span class="token comment">// 41 3200 16384 5 384 6.22%</span> <span class="token comment">// 42 3456 24576 7 384 8.83%</span> <span class="token comment">// 43 4096 8192 2 0 15.60%</span> <span class="token comment">// 44 4864 24576 5 256 16.65%</span> <span class="token comment">// 45 5376 16384 3 256 10.92%</span> <span class="token comment">// 46 6144 24576 4 0 12.48%</span> <span class="token comment">// 47 6528 32768 5 128 6.23%</span> <span class="token comment">// 48 6784 40960 6 256 4.36%</span> <span class="token comment">// 49 6912 49152 7 768 3.37%</span> <span class="token comment">// 50 8192 8192 1 0 15.61%</span> <span class="token comment">// 51 9472 57344 6 512 14.28%</span> <span class="token comment">// 52 9728 49152 5 512 3.64%</span> <span class="token comment">// 53 10240 40960 4 0 4.99%</span> <span class="token comment">// 54 10880 32768 3 128 6.24%</span> <span class="token comment">// 55 12288 24576 2 0 11.45%</span> <span class="token comment">// 56 13568 40960 3 256 9.99%</span> <span class="token comment">// 57 14336 57344 4 0 5.35%</span> <span class="token comment">// 58 16384 16384 1 0 12.49%</span> <span class="token comment">// 59 18432 73728 4 0 11.11%</span> <span class="token comment">// 60 19072 57344 3 128 3.57%</span> <span class="token comment">// 61 20480 40960 2 0 6.87%</span> <span class="token comment">// 62 21760 65536 3 256 6.25%</span> <span class="token comment">// 63 24576 24576 1 0 11.45%</span> <span class="token comment">// 64 27264 81920 3 128 10.00%</span> <span class="token comment">// 65 28672 57344 2 0 4.91%</span> <span class="token comment">// 66 32768 32768 1 0 12.50%</span> <span class="token keyword">const</span> <span class="token punctuation">(</span> _MaxSmallSize <span class="token operator">=</span> <span class="token number">32768</span> smallSizeDiv <span class="token operator">=</span> <span class="token number">8</span> smallSizeMax <span class="token operator">=</span> <span class="token number">1024</span> largeSizeDiv <span class="token operator">=</span> <span class="token number">128</span> _NumSizeClasses <span class="token operator">=</span> <span class="token number">67</span> _PageShift <span class="token operator">=</span> <span class="token number">13</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> class_to_size <span class="token operator">=</span> <span class="token punctuation">[</span>_NumSizeClasses<span class="token punctuation">]</span><span class="token builtin">uint16</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">,</span> <span class="token number">48</span><span class="token punctuation">,</span> <span class="token number">64</span><span class="token punctuation">,</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token number">96</span><span class="token punctuation">,</span> <span class="token number">112</span><span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token number">144</span><span class="token punctuation">,</span> <span class="token number">160</span><span class="token punctuation">,</span> <span class="token number">176</span><span class="token punctuation">,</span> <span class="token number">192</span><span class="token punctuation">,</span> <span class="token number">208</span><span class="token punctuation">,</span> <span class="token number">224</span><span class="token punctuation">,</span> <span class="token number">240</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">,</span> <span class="token number">288</span><span class="token punctuation">,</span> <span class="token number">320</span><span class="token punctuation">,</span> <span class="token number">352</span><span class="token punctuation">,</span> <span class="token number">384</span><span class="token punctuation">,</span> <span class="token number">416</span><span class="token punctuation">,</span> <span class="token number">448</span><span class="token punctuation">,</span> <span class="token number">480</span><span class="token punctuation">,</span> <span class="token number">512</span><span class="token punctuation">,</span> <span class="token number">576</span><span class="token punctuation">,</span> <span class="token number">640</span><span class="token punctuation">,</span> <span class="token number">704</span><span class="token punctuation">,</span> <span class="token number">768</span><span class="token punctuation">,</span> <span class="token number">896</span><span class="token punctuation">,</span> <span class="token number">1024</span><span class="token punctuation">,</span> <span class="token number">1152</span><span class="token punctuation">,</span> <span class="token number">1280</span><span class="token punctuation">,</span> <span class="token number">1408</span><span class="token punctuation">,</span> <span class="token number">1536</span><span class="token punctuation">,</span> <span class="token number">1792</span><span class="token punctuation">,</span> <span class="token number">2048</span><span class="token punctuation">,</span> <span class="token number">2304</span><span class="token punctuation">,</span> <span class="token number">2688</span><span class="token punctuation">,</span> <span class="token number">3072</span><span class="token punctuation">,</span> <span class="token number">3200</span><span class="token punctuation">,</span> <span class="token number">3456</span><span class="token punctuation">,</span> <span class="token number">4096</span><span class="token punctuation">,</span> <span class="token number">4864</span><span class="token punctuation">,</span> <span class="token number">5376</span><span class="token punctuation">,</span> <span class="token number">6144</span><span class="token punctuation">,</span> <span class="token number">6528</span><span class="token punctuation">,</span> <span class="token number">6784</span><span class="token punctuation">,</span> <span class="token number">6912</span><span class="token punctuation">,</span> <span class="token number">8192</span><span class="token punctuation">,</span> <span class="token number">9472</span><span class="token punctuation">,</span> <span class="token number">9728</span><span class="token punctuation">,</span> <span class="token number">10240</span><span class="token punctuation">,</span> <span class="token number">10880</span><span class="token punctuation">,</span> <span class="token number">12288</span><span class="token punctuation">,</span> <span class="token number">13568</span><span class="token punctuation">,</span> <span class="token number">14336</span><span class="token punctuation">,</span> <span class="token number">16384</span><span class="token punctuation">,</span> <span class="token number">18432</span><span class="token punctuation">,</span> <span class="token number">19072</span><span class="token punctuation">,</span> <span class="token number">20480</span><span class="token punctuation">,</span> <span class="token number">21760</span><span class="token punctuation">,</span> <span class="token number">24576</span><span class="token punctuation">,</span> <span class="token number">27264</span><span class="token punctuation">,</span> <span class="token number">28672</span><span class="token punctuation">,</span> <span class="token number">32768</span><span class="token punctuation">}</span> <span class="token keyword">var</span> class_to_allocnpages <span class="token operator">=</span> <span class="token punctuation">[</span>_NumSizeClasses<span class="token punctuation">]</span><span class="token builtin">uint8</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span> <span class="token keyword">type</span> divMagic <span class="token keyword">struct</span> <span class="token punctuation">{</span> shift <span class="token builtin">uint8</span> shift2 <span class="token builtin">uint8</span> mul <span class="token builtin">uint16</span> baseMask <span class="token builtin">uint16</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> class_to_divmagic <span class="token operator">=</span> <span class="token punctuation">[</span>_NumSizeClasses<span class="token punctuation">]</span>divMagic<span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65528</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65520</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65504</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">683</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65472</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">205</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">171</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">293</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65408</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">911</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">205</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">373</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">171</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">631</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">293</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">547</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65280</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">103</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">373</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">43</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">79</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">147</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">137</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">65024</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">103</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">187</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">43</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">37</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">64512</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">187</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">37</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">63488</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">49</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">41</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">19</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">61440</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">27</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">49</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">161</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">155</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">8</span><span class="token punctuation">,</span> [译]如果对齐内存的写入是原子性的,为什么我们还需要sync/atomic包

Golang是否真的没有指针运算?
golang内存对齐原理
Go的内存对齐和指针运算详解和实践
Golang 切片容量(cap)增长探秘
go 语言学习历程
golang 面试题(十三)interface内部结构和nil详解
Golang sync.WaitGroup源码详细分析
年度最佳【golang】内存分配详解
Go语言的主要特性和发展影响

[关闭]
~ ~