2017-04-21 61 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