当您使用
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);
不,创建可调整大小的 ArrayBuffer 时,不会预先保留完整的 maxByteLength。仅分配初始字节长度(本例中为 4)。
当你调用resize()时,一个新的ArrayBuffer将被分配新的大小。然后将原始缓冲区的内容复制到新缓冲区。
因此在您的示例中,前 4 个字节已分配。当调用 resize(8) 时,会分配一个新的 8 字节缓冲区,并复制原来的 4 字节。
ArrayBuffer 不维护对多个区域的引用 - resize() 处理创建新的连续缓冲区并复制数据。
因此 maxByteLength 只是定义了您可以调整大小的上限。调用 resize() 时,实际内存使用量会根据需要增长。