节点中缓冲模块的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强> 1。缓冲区的基本使用强>
6.0以在节点前,直接使用新的缓冲,但是这种方式存在两个问题:
- <李>
参数复杂:内存分配,还是内存分配+内容写入,需要根据参数来确定
李> <李>安全隐患:分配到的内存可能还存储着旧数据,这样就存在安全隐患
李>//,本来只想申请一块内存,但是里面却存在旧数据 const buf1 =, new 缓冲区(10),//,& lt; Buffer 90年,09年,70,6 b bf 7 f 00, 00, 50, 3 a>//,不小心,旧数据就被读取出来了 buf1.toString (),//, & # 39; ? \ tpk ?\ u0000 \ u0000P: & # 39;
为了解决上述问题,缓冲提供了<代码> Buffer.from 代码>,<代码> Buffer.alloc 代码>,<代码> Buffer.allocUnsafe 代码>,<代码> Buffer.allocUnsafeSlow 代码>四个方法来申请内存。
//,申请10个字节的内存 const buf2 =, Buffer.alloc (10),//, & lt; Buffer 00, 00, 00, 00, 00, 00, 00, 00, 00, 00比;//,默认情况下,用0进行填充 buf2.toString (),//& # 39; \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000& # 39;//,上述操作就相当于 const buf1 =, new 缓冲区(10); buf.fill (0); buf.toString ();,//, & # 39; \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000& # 39;
<强> 2。缓冲区的结构强>
缓冲区是一个典型的javascript与c++结合的模块,其性能部分用c++实现,非性能部分用javascript来实现。
下面看看缓冲模块的内部结构:
exports.Buffer =,缓冲; 时间=exports.SlowBuffer SlowBuffer; 时间=exports.INSPECT_MAX_BYTES 50; exports.kMaxLength =, binding.kMaxLength;
缓冲模块提供了4个接口:
- <李>
缓冲:二进制数据容器类,节点启动时默认加载
李> <李>SlowBuffer:同样也是二进制数据容器类,不过直接进行内存申请
李> <李>INSPECT_MAX_BYTES:限制bufObject.inspect()输出的长度
李> <李>kMaxLength:一次性内存分配的上限,大小为(2 ^ 31 - 1)
李>其中,由于缓冲经常使用,所以节点在启动的时候,就已经加载了缓冲区,而其他三个,仍然需要使用要求(& # 39;缓冲# 39;)。* * *。
关于缓冲的内存申请,填充,修改等涉及性能问题的操作,均通过c++里面的node_buffer。cc来实现:
//, c++里面的node_buffer namespace node  { ,bool zero_fill_all_buffers =,假; ,namespace Buffer  { ,,… ,} } NODE_MODULE_CONTEXT_AWARE_BUILTIN(缓冲,节点:缓冲::初始化)
<强> 3。内存分配的策略强>
节点中缓冲区内存分配太过常见,从系统性能考虑出发,缓冲采用了如下的管理策略。
,
<强> 3.1 Buffer.from 强>
<代码> Buffer.from(价值,……)代码>用于申请内存,并将内容写入刚刚申请的内存中,价值值是多样的,缓冲是如何处理的呢?让我们一起看看源码:
Buffer.from =,功能(价值,encodingOrOffset,,长度),{ ,if (typeof value ===, & # 39;数字# 39;) throw 才能;new  TypeError (& # 39;“value", argument must not be a 数字# 39;); ,if (value instanceof  ArrayBuffer) return 才能;fromArrayBuffer(价值,encodingOrOffset,,长度); ,if (typeof value ===, & # 39;字符串# 39;) return 才能;fromString(价值,encodingOrOffset); ,return fromObject(价值); };
值可以分成三类:
- <李>
ArrayBuffer的实例:ArrayBuffer是ES2015里面引入的,用于在浏览器端直接操作二进制数据,这就样节点与ES2015关联起来,同时,新创建的缓冲与ArrayBuffer内存是共享的
李> <李>字符串:该方法实现了将字符串转变为缓冲
李> <李>缓冲/TypeArray/数组:会进行值的复制
李><强> 3.1.1 ArrayBuffer的实例