0

我正在阅读有关网络工作者的这篇文章,并且遇到了有关可转移对象的这一部分:

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

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

如果有人在那里有一些有价值的见解,我还想了解整个过程是如何在幕后进行的。

4

1 回答 1

-1

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

2.7.2 可转移对象

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

注意:转移是一种不可逆且非幂等的操作。一旦一个对象被转移,它就不能被转移,或者实际上不能再次使用。

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

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

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

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

转账收款步骤,取一个 RecorddataHolder和一个平台对象value

接收数据的一组步骤dataHolder,使用它进行value适当的设置。value将是相关平台对象类型的新创建实例,没有设置其内部数据;设置是这些步骤的工作。

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

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

另见2.9.2。可转移对象

于 2017-10-26T21:46:06.253 回答