簡體   English   中英

JavaScript可傳輸對象:引擎為什么不保留原始實例?

[英]JavaScript Transferable Objects: Why doesn't the engine preserve the original instance?

我正在閱讀有關網絡工作者的這篇文章,並且遇到了有關可轉移對象的這一部分:

使用可傳輸對象,數據從一個上下文傳輸到另一個上下文。 它是零拷貝的,這極大地提高了將數據發送到Worker的性能。 如果您來自C / C ++世界,可以將其視為傳遞引用。 但是,與傳遞引用不同的是, 調用上下文中的“版本”一旦轉移到新上下文中就不再可用。

為什么? 根據我對Abstract Stack Machines的理解,可以完全保留原始指針是完全合理的。 不可否認,由於現在是從另一個上下文引用數據,因此繼續使用它是一項棘手的任務,但並非完全不合理。 為什么清除原始對象?

如果有人在那里有一些寶貴的見解,我也想學習整個過程是如何進行的。

傳輸對象的一種可能原因是減少用於存儲同一對象的多個副本的內存量。

2.7.2可轉移對象

可轉移對象支持跨事件循環轉移。 在共享對基礎數據的引用,然后分離正在傳輸的對象的同時,傳輸是有效地重新創建對象。 這對於轉讓昂貴資源的所有權很有用。 並非所有對象都是可轉移的對象,並且在轉移時不一定保留所有可轉移對象的方面。

注意:傳輸是不可逆且非冪等的操作。 對象一旦被傳輸,就無法再次傳輸或確實被使用。

如果平台對象僅實現使用[Transferable] IDL擴展屬性修飾的接口,則它們可以是可轉讓對象。 這些接口還必須定義以下算法:

轉移步驟 ,獲取平台對象值和Record dataHolder

一組將值中的數據傳輸到dataHolder字段中的dataHolder 保留在dataHolder的結果數據必須獨立於任何JavaScript領域

如果無法進行轉移,這些步驟可能會引發異常。

傳輸接收步驟 ,獲取Record dataHolder和平台對象value

一組步驟,用於接收dataHolder的數據, dataHolder使用它來適當地設置value value將是所討論的平台對象類型的新創建實例,並且未設置其內部數據; 設置是這些步驟的工作。

如果無法接收轉移,這些步驟可能會引發異常。

取決於各個平台對象的定義,以確定這些步驟將傳輸哪些數據。 通常,這些步驟非常對稱。

另請參閱2.9.2。 可轉讓對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM