1

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

(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”中导入诸如 malloc、free、strcopy 等 C 函数。

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

4

1 回答 1

2

grow_memory返回以前的大小(以页为单位)或-1 根据其规范

这不会改变初始页面分配(memory $0 1)!这是模块的静态属性,而当前内存大小是内存的动态属性。这就像增长一个您最初为其保留 1 个元素的数组。你最初还是保留1,改变的是当前大小。

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

malloc//都是您可以使用free. 该操作码类似于. 当然,WebAssembly 嵌入器也使用内存分配来授予您的操作码请求,这本身可以用/ /实现,或者更可能用.reallocgrow_memorysbrkmallocfreereallocmmap

于 2017-04-21T14:01:18.483 回答