1.buffernode
buffer.allocUnsafe(size)和allocUnsafeSlow(size)能够迅速建立一个buffer实例,可是使用的内存可能来源于共享内存池,所以可能包含有内存中未释放的旧数据。最好使用前彻底重写内存。bash
共享内存的还包括:Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存spa
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);
// 打印: <Buffer 88 a0>
console.log(buf2);
// 打印: <Buffer 88 13 a0 0f>
arr[1] = 6000;
console.log(buf1);
// 打印: <Buffer 88 a0>
console.log(buf2);
// 打印: <Buffer 88 13 70 17>
复制代码
以及使用slice切割的buffer内容,也是共享buffer内存code
buf.byteOffset对象
须要注意的是,当Buffer.from(ArrayBuffer, byteOffset, length) 设置了 byteOffset 或建立一个小于 Buffer.poolSize 的 Buffer 时,底层的 ArrayBuffer 的偏移量并非从 0 开始内存
const nodeBuffer = Buffer.from('test poolsize byteoffset')
console.log(nodeBuffer.byteOffset)//512
const 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 对象string
// 建立一个小于 `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);
复制代码