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);
複製代碼