2017-04-21 96 views
0

閱讀我嘗試種植一些內存規格後,也做了以下內容:Webassembly成長記憶和進口的malloc

(module 
    (table 0 anyfunc) 
    (memory $0 1) 
    (export "memory" (memory $0)) 
    (export "f" (func $0)) 
    (func $0 (param $0 i32) (result i32) 
    get_local $0 
    grow_memory 
) 
) 

現在我希望,如果我們輸入10,我們有11頁大小倍數,所以像:

(memory $0 1) 

變爲

(memory $0 11) 

我不得不添加一個返回值SI堆棧沒有被清空。現在我假設該方法返回非-1的東西,如果它成功的權利?在這種情況下,我認爲它有效,我應該有更多的頁面。

我知道也有JS方式,但我更喜歡直接在WebAssembly內部做所有這些東西。有趣的是,我們可以從「Env」中導入C函數,例如malloc,free,strcopy等。

所以我的問題是:我的方法是增加內存的正確性嗎?我應該導入C風格的模塊嗎? grow_memory和realloc()之間的關係是什麼,或者說有什麼不同?

回答

1

grow_memory返回以前的大小(以頁爲單位)或-1according to its specification

這不會改變初始頁面分配(memory $0 1)!這是模塊的靜態屬性,而當前的內存大小是內存的動態屬性。這就像增加一個數組,你最初預留了一個元素。您仍然最初保留1,現在的大小發生了變化。

您也可以使用drop來忽略grow_memory的返回值。

malloc/free/realloc是您可以使用grow_memory執行的所有事情。該操作碼與sbrk類似。當然,WebAssembly嵌入程序也使用內存分配來授予您的操作碼請求,該請求本身可以用malloc/free/realloc或更可能用mmap實現。

+0

太好了,你說得對。也是下降很好,我完全忘了它。確實有助於在需要時保持堆棧清晰。 – Asperger

+0

我也可以根據https://github.com/WebAssembly/design/blob/master/FutureFeatures.md#finer-grained-control-over-memory丟棄信息。所選範圍只是歸零。有趣。 – Asperger

+0

有一個問題,我正確理解grow_memory是否在使用malloc等的情況下使用? – Asperger