JavaScript可转移对象:为什么引擎不保留原始实例?

时间:2017-10-26 21:35:41

标签: javascript web-worker transferable

我正在阅读Long.valueOf,我看到了有关可转让对象的这一部分:

  

使用可转移对象,数据从一个上下文传输到另一个上下文。它是零拷贝,极大地提高了向Worker发送数据的性能。如果您来自C / C ++世界,请将其视为传递参考。但是,与传递引用不同,调用上下文中的“版本”在转移到新上下文后不再可用。

为什么?根据我对抽象堆栈机器的理解,原始指针可以保持原样似乎是完全合理的。不可否认,由于现在从另一个上下文引用数据,继续使用它将是一项棘手的任务,但并非完全不合理。为什么原始对象被清除?

如果有人在那里有一些宝贵的见解,我也想了解整个过程是如何发生的。

1 个答案:

答案 0 :(得分:-1)

传输对象的一个​​可能原因是减少用于存储同一对象的多个副本的内存量。

  

2.7.2 Transferable objects

     

可转移对象支持跨事件循环传输。   转移有效地在共享对象时重新创建对象   引用基础数据,然后分离对象   转移。这对转移昂贵的所有权很有用   资源。并非所有对象都是可转移的对象,而不是全部   作为可转移对象的对象的方面是必然的   转移时保留。

     
    

注意:     转移是一种不可逆转的,非幂等的操作。曾经     对象已被转移,无法转移或确实使用,     试。

  
     

Platform objects如果只实现用[Transferable] IDL扩展属性修饰的接口,则可以是可转移对象。此类接口还必须定义以下算法:

     

转移步骤,获取平台对象值和记录dataHolder

     
    

将值中的数据传输到的一组步骤     dataHolder的字段。 dataHolder中保存的结果数据必须独立于任何JavaScript Realm

         

如果无法进行转移,这些步骤可能会引发异常。

  
     

转移接收步骤,记录dataHolder和平台对象value

     
    

一组接收dataHolder中的数据的步骤,使用它来适当地设置valuevalue将是一个新创建的平台对象类型的实例,它的内部数据都没有设置;设置它是这些步骤的工作。

         

如果无法接收转移,这些步骤可能会引发异常。

  

由各个平台对象定义,以确定这些步骤传输的数据。通常,这些步骤非常对称。

另见2.9.2. Transferable objects