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
来实现。
阅读规格后,我试图增加一些内存并执行了以下操作:
(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
来实现。