【问题标题】:Webassembly growing memory and importing mallocWebassembly增长内存和导入malloc
【发布时间】:2017-04-21 13:19:59
【问题描述】:

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

(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() 有什么关系,或者说区别?

【问题讨论】:

    标签: webassembly


    【解决方案1】:

    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 实现。

    【讨论】:

    • 哇,你说得对。 drop也很好,我完全忘记了它。确实有助于在必要时保持堆栈清晰。
    • 我也可以根据github.com/WebAssembly/design/blob/master/…丢弃信息。所选范围刚刚清零。很有趣。
    • 一个问题,所以我是否正确理解 grow_memory 是在后台使用然后使用 malloc 等?
    • 这是 WebAssembly 为您的工具链提供的工具。它不必使用该工具。 Emscripten 可以像 asm.js 一样使用,而不是使用grow_memory:只需预先分配足够大的内存,希望您永远不需要更多。然后它的 malloc 实现只需在该内存中分配,但永远无法获得更多。如果你愿意,它也可以使用grow_memory,但 WebAssembly 不会强迫你。你甚至可以在没有任何内存的情况下编写有效(并且有用!)的 WebAssembly 模块。
    猜你喜欢
    • 1970-01-01
    • 2015-04-19
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多