节点中缓冲模块的作用是什么

  

节点中缓冲模块的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强> 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的实例

节点中缓冲模块的作用是什么