1.buffer
buffer.allocUnsafe(size)和allocUnsafeSlow(size)可以迅速创建一个buffer实例,但是使用的内存可能来源于共享内存池,因此可能包含有内存中未释放的旧数据。最好使用前完全重写内存。
共享内存的还包括:Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存
const arr = new Uint16Array(2);arr[0] = 5000;arr[1] = 4000;// 拷贝 `arr` 的内容。const buf1 = Buffer.from(arr);// 与 `arr` 共享内存。const buf2 = Buffer.from(arr.buffer);console.log(buf1);// 打印:console.log(buf2);// 打印: arr[1] = 6000;console.log(buf1);// 打印: console.log(buf2);// 打印: 复制代码
以及使用slice切割的buffer内容,也是共享buffer内存
buf.byteOffset
需要注意的是,当Buffer.from(ArrayBuffer, byteOffset, length) 设置了 byteOffset 或创建一个小于 Buffer.poolSize 的 Buffer 时,底层的 ArrayBuffer 的偏移量并不是从 0 开始
const nodeBuffer = Buffer.from('test poolsize byteoffset')console.log(nodeBuffer.byteOffset)//512const nodeBuffer1 = Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])console.log(nodeBuffer.byteOffset)//536复制代码
因此,当使用 Buffer 创建 TypedArray 时,需要正确地指定 byteOffset。直接使用 buf.buffer 访问底层的 ArrayBuffer 时, ArrayBuffer 的第一个字节可能并不指向 buf 对象
// 创建一个小于 `Buffer.poolSize` 的 `Buffer`。const nodeBuffer = new Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);// 将 `Buffer` 赋值给一个 `Int8Array`。new Int8Array(nodeBuffer.buffer, nodeBuffer.byteOffset, nodeBuffer.length);复制代码