wee_alloc(malloc替代品)如何知道在WebAssembly中从哪里开始堆?



我正在尝试在WebAssembly中以自定义语言使用wee_alloc。但是,我需要完全了解它如何知道从哪里开始堆,以便我的堆栈和静态分配不会破坏它,反之亦然。

我的理解是,malloc 等人如何知道从哪里开始堆取决于平台,通常只是一个约定,或者在某些情况下不适用。然而,在 WebAssembly 中,我们只能有一个连续的线性内存,所以我们必须共享它,并且需要使用约定。

通读代码,似乎wee_alloc所做的是假设我们开始使用的任何内存都是完全禁止的,而是将使用grow_memory指令来创建堆所需的第一块内存。这实际上意味着堆开头的索引/地址是初始大小的最高索引,加上 1。(编辑:它实际上不是+ 1,我忘记了索引是从零开始的;错误( ☠️

例如,如果我们从 1 页的初始内存大小开始:

current_memory = 1 page = 64KiB = 65,536 bytes

然后堆从索引 65537 开始。

我的理解正确吗?

你的理解是正确的!不过有一个小例外:因为 索引从零开始,第一页的最后一个索引是65535, 第二页的第一个索引是65536。- @pepyakin

https://github.com/rustwasm/wee_alloc/issues/61#issuecomment-416868326

相关内容

  • 没有找到相关文章

最新更新