[英]node.js Buffer not empty
当我创建大量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.11.14
行为v0.8.28
TL;博士
Buffer.prototype.fill
清除它 这很可能是使用处理内存分配的API时所期望的,例如Buffer。
Buffer
实际上是使用了smalloc
模块,您可以将其视为来自stdlib.h的 malloc(3) / free(3)
malloc背后的原理是它只为指针分配/保留内存 - 在webkit中,它可能看起来更接近于对象上的ExternalArray的calloc 。
见http://linux.die.net/man/3/malloc
malloc()函数分配大小字节并返回指向已分配内存的指针。 内存未初始化。
内存分配/释放不处理内存初始化,因为遍历每个字节并将其设置为0会更昂贵。
除了0并不总是一个字节所需的初始值。
并且由于内存分配可以返回之前由其他进程使用过的内存块,因此预计会在新分配的块中包含数据。
一般规则是:在分配内存时(比如Buffer),如果需要初始化,请使用buf.fill(0)
; 虽然这并不总是需要,因为在大多数情况下,当您需要Buffer时,您已经知道了数据的长度,隐含的内容。
例如,当您创建new Buffer(30)
您知道您的数据长度为30个字节,这意味着您已经知道要写入的数据是什么样的,所以最后您很可能最终会写入每个字节,在将缓冲区传递给其他字节之前 - 因此无需预先添加将每个字节设置为0的额外初始化循环。
对于使用字节作为对象的标志/状态的缓冲区,您只能初始化它们。
例如,如果您的Buffer(10)
使用前2个字节作为某些状态的标志,而其他8个字节用于数据,则只执行buffer[0] = buffer[1] = 0
,将它们设置为初始0值,而不是初始化全部10个字节,然后再对最后8个进行写操作。
最后一点:如果之前没有使用内存分配返回的内存块,那么是的,所有字节都设置为0.但是,内存处理是操作系统所做的 - 使用各种优化 - 因此无法预测你将得到什么内存段及其内容。
在最新版本的Node(v5.10.0 +)中,您可以使用
--zero-fill-buffers
https://nodejs.org/api/buffer.html#buffer_the_zero_fill_buffers_command_line_option
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.