gpt4 book ai didi

javascript - node.js 缓冲区不为空

转载 作者:搜寻专家 更新时间:2023-10-31 23:31:41 28 4
gpt4 key购买 nike

当我创建很多 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

  • 这是我的特定机器的问题吗?
  • 这是 node.js 的普遍问题(又名错误)吗?
  • 这是一个特殊组合的问题(例如,只有 Windows 环境)?
  • 这是预期的吗?我必须在开始使用它之前清除 Buffer 吗?
  • 这是否记录在案?

更新:在 v0.11.14 上表现更好,在 v0.8.28

上表现更差

最佳答案

tl;dr

  • 这不是您特定机器的问题,而是所有机器上的问题。
  • 不是错误。这种行为存在于所有内存分配库中。
  • 不依赖于操作系统。所有操作系统都以这种方式运行。
  • 如果您需要初始化它,那么是的,使用Buffer.prototype.fill清除它
  • 是的,它记录在 nodejs/webkit 使用的底层库中:参见 malloc(3)/stdlib

这很可能是使用处理内存分配的 API(例如 Buffer)时所期望的。

Buffer 实际上使用的是 smalloc 模块,您可以将其视为 ma​​lloc(3)/free(3) 来自 stdlib.h

malloc 背后的原理是它只为指针分配/保留内存 - 在 webkit 中,它可能看起来更接近对象上的 ExternalArray 的 calloc

参见 http://linux.die.net/man/3/malloc

The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized.

内存分配/解除分配不处理内存初始化,因为遍历每个字节并将其设置为 0 的开销更大。

此外,0 并不总是您需要的字节初始值。

并且由于内存分配可以返回一 block 之前已被其他进程使用过的内存块,因此预计新分配的 block 中会有数据。

一般规则是:分配内存时(例如 Buffer 所做的),如果您需要它会初始化使用 buf.fill(0);尽管这并不总是需要的,因为在大多数情况下,当您需要 Buffer 时,您已经知道数据的长度,隐含的内容。

例如,当您创建 new Buffer(30) 时,您知道您的数据有 30 个字节长,这意味着您已经知道要写入的数据是什么样的,所以在在将缓冲区传递给其他东西之前,您很可能最终会写入每个字节 - 因此无需预先添加将每个字节设置为 0 的额外初始化循环。

对于使用字节作为对象标志/状态的缓冲区,您只能初始化它们。

例如如果您的 Buffer(10) 使用前 2 个字节作为某些状态的标志,而其他 8 个字节用于数据,则只执行buffer[0] = buffer[1] = 0,将它们设置为初始值 0,而不是初始化所有 10 个字节,然后对最后 8 个字节进行写入。

最后一点:如果内存分配返回的内存块以前没有被使用过,那么是的,所有字节都设置为 0。但是,内存处理是操作系统所做的事情——使用各种优化——因此它是无法预测您将获得哪个内存段及其内容。

关于javascript - node.js 缓冲区不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27167350/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com