Buffer.allocUnsafeSlow(size)
size
<integer> 新的Buffer
所需的长度。
分配 size
个字节的新 Buffer
。
如果 size
大于 buffer.constants.MAX_LENGTH
或小于 0,则抛出 ERR_INVALID_ARG_VALUE
。
如果 size
为 0,则创建零长度 Buffer
。
以这种方式创建的 Buffer
实例的底层内存不会被初始化。
新创建的 Buffer
的内容是未知的,可能包含敏感的数据。
使用 buf.fill(0)
用零初始化此类 Buffer
实例。
当使用 Buffer.allocUnsafe()
分配新的 Buffer
实例时,4 KiB 以下的分配是从单个预分配的 Buffer
中分割出来的。
这允许应用程序避免创建许多单独分配的 Buffer
实例的垃圾收集开销。
这种方法无需跟踪和清理尽可能多的单个 ArrayBuffer
对象,从而提高了性能和内存使用率。
但是,在开发人员可能需要在不确定的时间内从池中保留一小块内存的情况下,使用 Buffer.allocUnsafeSlow()
创建未池化的 Buffer
实例然后复制出相关位可能是合适的。
import { Buffer } from 'node:buffer';
// 需要保留一些小块内存。
const store = [];
socket.on('readable', () => {
let data;
while (null !== (data = readable.read())) {
// 为保留的数据分配。
const sb = Buffer.allocUnsafeSlow(10);
// 将数据复制到新分配中。
data.copy(sb, 0, 0, 10);
store.push(sb);
}
});
const { Buffer } = require('node:buffer');
// 需要保留一些小块内存。
const store = [];
socket.on('readable', () => {
let data;
while (null !== (data = readable.read())) {
// 为保留的数据分配。
const sb = Buffer.allocUnsafeSlow(10);
// 将数据复制到新分配中。
data.copy(sb, 0, 0, 10);
store.push(sb);
}
});
如果 size
不是数值,则会抛出 TypeError
。
size
<integer> The desired length of the newBuffer
.
Allocates a new Buffer
of size
bytes. If size
is larger than
buffer.constants.MAX_LENGTH
or smaller than 0, ERR_INVALID_ARG_VALUE
is thrown. A zero-length Buffer
is created if size
is 0.
The underlying memory for Buffer
instances created in this way is not
initialized. The contents of the newly created Buffer
are unknown and
may contain sensitive data. Use buf.fill(0)
to initialize
such Buffer
instances with zeroes.
When using Buffer.allocUnsafe()
to allocate new Buffer
instances,
allocations under 4 KiB are sliced from a single pre-allocated Buffer
. This
allows applications to avoid the garbage collection overhead of creating many
individually allocated Buffer
instances. This approach improves both
performance and memory usage by eliminating the need to track and clean up as
many individual ArrayBuffer
objects.
However, in the case where a developer may need to retain a small chunk of
memory from a pool for an indeterminate amount of time, it may be appropriate
to create an un-pooled Buffer
instance using Buffer.allocUnsafeSlow()
and
then copying out the relevant bits.
import { Buffer } from 'node:buffer';
// Need to keep around a few small chunks of memory.
const store = [];
socket.on('readable', () => {
let data;
while (null !== (data = readable.read())) {
// Allocate for retained data.
const sb = Buffer.allocUnsafeSlow(10);
// Copy the data into the new allocation.
data.copy(sb, 0, 0, 10);
store.push(sb);
}
});
const { Buffer } = require('node:buffer');
// Need to keep around a few small chunks of memory.
const store = [];
socket.on('readable', () => {
let data;
while (null !== (data = readable.read())) {
// Allocate for retained data.
const sb = Buffer.allocUnsafeSlow(10);
// Copy the data into the new allocation.
data.copy(sb, 0, 0, 10);
store.push(sb);
}
});
A TypeError
will be thrown if size
is not a number.