Webassembly 增加内存并导入 malloc

Webassembly growing memory and importing malloc

阅读规格后,我试图增加一些内存并执行了以下操作:

(module
  (table 0 anyfunc)
  (memory [=10=] 1)
  (export "memory" (memory [=10=]))
  (export "f" (func [=10=]))
  (func [=10=] (param [=10=] i32) (result i32)
    get_local [=10=]
    grow_memory
  )
)

现在我希望如果我们输入 10,我们的页面大小将是 11 的倍数,例如:

 (memory [=11=] 1)

变成

 (memory [=12=] 11)

我不得不添加一个 return 值,因为堆栈没有被清空。现在我假设方法 return 是 -1 以外的东西,如果它成功了对吗?在这种情况下,我认为它有效,我应该有更多的页面。

我知道还有 JS 方式,但我更喜欢直接在 WebAssembly 中完成所有这些工作。有趣的是,我们可以从 "Env"..

导入 C 函数,例如 malloc、free、strcopy 等

所以我的问题是:我增加内存的方法是否正确?我应该改为导入 C 样式模块吗? grow_memory和realloc()有什么关系,或者说区别?

grow_memory returns 以前的大小(以页为单位)或 -1 according to its specification.

这不会更改初始页面分配 (memory [=12=] 1)!这是模块的静态 属性,而当前内存大小是内存的动态 属性。这就像增长一个您最初为其保留 1 个元素的数组。你一开始还是预留了1,改变的是现在的尺寸。

您也可以使用 drop 忽略 grow_memory 的 return 值。

malloc / free / realloc 都是你可以使用 grow_memory 实现的东西。该操作码类似于 sbrk。当然,WebAssembly 嵌入器也使用内存分配来满足你的操作码的请求,它本身可以用 malloc / free / realloc 或更可能用 mmap 来实现。