当我创建大量Buffer
时,它们并不总是空的:
for (var i = 0; i < 100; i++) {
console.log((new Buffer(30)).toString('hex'));
}
(部分)输出:
782668013a0000003b00000035000000b0c17900391100003c0000003d00
e4216801ffffffff000000000100000000000000000000003e0000003f00
40c27900100000000100000000000000000000000000000018c379000000
000000000000000000000000000000000000000000000000000000000000 --> Empty
000000000000000000000000000000000000000000000000000000000000 --> Empty
0000000000000000108269014000000041000000c86f79000cf679000000
6611000080c27900c0c27900040000000100000000000000d0c279000000
00000000000000005c2468014200000043000000cc6f7900002668014400
(部分)输出(不包含.toString('hex')
且仅new Buffer(10)
):
<Buffer 01 00 00 00 58 db 62 00 b4 86>
<Buffer 90 b9 65 00 08 00 00 00 03 00>
<Buffer 10 ba 65 00 04 00 00 00 00 00>
<Buffer 04 00 00 00 00 00 00 00 00 00>
<Buffer 10 00 00 00 00 00 00 00 70 ba>
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer ff ff ff ff ff ff ff ff 00 00>
<Buffer 00 00 00 00 0f 00 00 00 8c 6f>
<Buffer 80 ba 65 00 00 00 00 00 aa 00>
我在32位Windows 7计算机上运行node.js v0.10.33
。
Buffer
吗? 更新: v0.11.14
上的行为更好,v0.8.28
上的行为更糟
答案 0 :(得分:8)
<强> TL;博士强>
Buffer.prototype.fill
这很可能是使用处理内存分配的API时所期望的,例如Buffer。
Buffer
实际上是使用smalloc
模块,您可以将其视为 malloc(3) / free(3)来自<强> stdlib.h中强>
malloc背后的原理是它只为指针分配/保留内存 - 在webkit中,对于对象上的ExternalArray,它可能看起来更接近 calloc 。
请参阅http://linux.die.net/man/3/malloc
malloc()函数分配大小字节并返回指向的指针 分配的内存。 内存未初始化。
内存分配/释放不处理内存初始化,因为遍历每个字节并将其设置为0会更昂贵。
除了0并不总是一个字节所需的初始值。
由于内存分配可以返回之前由其他进程使用过的内存块,因此预计会在新分配的块中包含数据。
一般规则是:在分配内存(例如缓冲区)时,如果 需要 ,则初始化使用buf.fill(0)
;虽然这并不总是需要,因为在大多数情况下,当你需要Buffer时,你已经知道数据的长度,隐含的内容。
例如,当您创建new Buffer(30)
时,您知道您的数据长度为30个字节,这意味着您已经知道要写入的数据是什么样的,所以最终您很可能会结束在将缓冲区传递给其他字符之前写入每个字节 - 因此无需预先添加一个将每个字节设置为0的初始化循环。
对于使用字节作为对象的标志/状态的缓冲区,您只能初始化它们。
E.g。如果你的Buffer(10)
使用前2个字节作为某些状态的标志,而其他8个字节作为数据,则只做
buffer[0] = buffer[1] = 0
,将它们设置为初始值0,而不是初始化所有10个字节,然后再对最后8个字进行写操作。
最后一点:如果以前没有使用内存分配返回的内存块,那么是的,所有字节都设置为0.但是,内存处理是操作系统所做的 - 使用各种优化 - 因此它是无法预测你会得到什么样的记忆片段及其内容。
答案 1 :(得分:0)
在最新版本的Node(v5.10.0 +)中,您可以使用
--zero-fill-buffers
https://nodejs.org/api/buffer.html#buffer_the_zero_fill_buffers_command_line_option