为可调整大小的 Javascript ArrayBuffer 分配的内存

问题描述 投票:0回答:1

当您使用

maxByteLength
初始化 ArrayBuffer 以使其可调整大小时,是否会预先在内存中保留
maxByteLength
字节,以便 ArrayBuffer 可以在连续的内存空间中增长?

或者调整大小时是否保留了新的内存空间?如果是这样,原始 ArrayBuffer 中的字节是否被复制,或者 ArrayBuffer 是否维护对多个非连续区域的引用?

解释我正在谈论的情况的代码示例:

const a = new ArrayBuffer(4, { maxByteLength: 8 });
new Uint32Array(a)[0] = 1024;
/* Will the ArrayBuffer grow within the initially
allocated memory region here,
will it reserve 4 more bytes somewhere else,
or will it reserve 8 bytes somewhere else and copy
over the existing data? */
a.resize(8);
javascript arraybuffer
1个回答
0
投票

不,创建可调整大小的 ArrayBuffer 时,不会预先保留完整的 maxByteLength。仅分配初始字节长度(本例中为 4)。

当你调用resize()时,一个新的ArrayBuffer将被分配新的大小。然后将原始缓冲区的内容复制到新缓冲区。

因此在您的示例中,前 4 个字节已分配。当调用 resize(8) 时,会分配一个新的 8 字节缓冲区,并复制原来的 4 字节。

ArrayBuffer 不维护对多个区域的引用 - resize() 处理创建新的连续缓冲区并复制数据。

因此 maxByteLength 只是定义了您可以调整大小的上限。调用 resize() 时,实际内存使用量会根据需要增长。

© www.soinside.com 2019 - 2024. All rights reserved.