Zig 内存分配器接口中的重映射函数应该“尝试扩展或缩小内存,以允许重定位”。特别是,它提到...
返回值
null
表示调整大小相当于分配新内存、从旧内存复制字节,然后释放旧内存。在这种情况下,调用者执行复制会更有效率。
我不明白为什么说执行复制更有效率。如果我想复制一些内存块,我必须分配一些新内存,复制字节并(最终)释放旧块。那么我获得了什么效率?
我唯一能想到的是,如果我已经有一个已分配的内存块,我可以重用它进行复制,在这种情况下我可以避免分配步骤。
Zig 内存分配器接口中的重映射函数应该“尝试扩展或缩小内存,以允许重定位”。特别是,它提到...
返回值
null
表示调整大小相当于分配新内存、从旧内存复制字节,然后释放旧内存。在这种情况下,调用者执行复制会更有效率。
我不明白为什么说执行复制更有效率。如果我想复制一些内存块,我必须分配一些新内存,复制字节并(最终)释放旧块。那么我获得了什么效率?
我唯一能想到的是,如果我已经有一个已分配的内存块,我可以重用它进行复制,在这种情况下我可以避免分配步骤。
remap
尚未出现在任何实际的 Zig 版本中。它于 2 天前被签入主分支。它实际上可能不会出现在任何实际版本中。也就是说,通过查看
remap
在同一提交中引入的 的用法,我们可以看到促使此接口出现的情况。这个想法是,调用者无法比 更有效地执行 alloc/copy/free 序列remap
,但它可能无论如何都不想执行该特定的 alloc/copy/free 序列。例如,在
array_list.zig
下addManyAt
:如果
remap
无需复制即可继续,则执行此操作。否则,代码将分配一个新缓冲区,但它会分别将原始缓冲区前后的部分复制index
到新缓冲区中它们需要进入的部分。它还避免在旧缓冲区的末尾、旧长度和容量之间复制任何未定义的空间。