在阅读规范后,我试图增加一些记忆并做了以下事情:
(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)
我必须添加一个返回值,因为堆栈没有被清空。现在我假设如果成功的话,该方法会返回除-1之外的其他内容吗?在这种情况下,我认为它有效,我应该有更多的页面。
我知道还有JS方式,但我更喜欢直接在WebAssembly中完成所有这些工作。有趣的是,我们可以从" Env"中导入C函数,如malloc,free,strcopy等。
所以我的问题是:我的方法是增长记忆力吗?我应该导入C风格模块吗? grow_memory和realloc()之间的关系是什么,或说区别?
答案 0 :(得分:2)
grow_memory
会返回之前的尺寸(以页为单位)或-1
according to its specification。
这不会更改初始页面分配(memory $0 1)
!这是模块的静态属性,而当前内存大小是内存的动态属性。这就像增长一个你最初保留1个元素的数组。您最初仍保留1,更改的是当前大小。
您还可以使用drop
来忽略grow_memory
的返回值。
malloc
/ free
/ realloc
是您可以使用grow_memory
实现的所有内容。该操作码与sbrk
类似。当然,WebAssembly嵌入器也使用内存分配来授予操作码的请求,这可能本身可以用malloc
/ free
/ realloc
实现,或者更可能用mmap
实现。