假设将生成包含大量数据的WebAssembly模块(wat
格式)。程序开始运行后,数据将在运行时动态更改和更改。我不太清楚我知道将数据放在生成的WebAssembly模块中的哪个位置。
我正在努力完成(在WebAssembly中)这个JavaScript演示的内容:
var data = [
100.1, 100.2, 200.1, 200.2,
300.12, 300.123, ...
]
我最终会做的事情如下:
var subset = data.slice(2, 4)
storeSubset(subset)
data[5] = 500.3
subset[2] = 600
...但是在WebAssembly而不是JavaScript中,data
和subset
是某些函数的局部变量;它们不是全局变量。尽管如果有必要,可能还有一个全局数据集。
想知道将数据放在生成的模块中的哪个位置。因此,程序将从头开始将这些数据内置到其中。基本上,有一些初始化数据将在运行时动态修改。
这就是我在伪代码中尝试完成的事情:
(module
(load float16 memorylocation, 200.1)
(load float16 memorylocation, 200.2)
... for every piece of data
)
不确定(a)是否应该这样做(一次一件),或(b)它可以以某种方式批量完成。像这样:
(module
(static memorylocation, 0101010110101...) ;; the bytes of all the `data`
(block (loop ...)) ;; loop through it and do `(load ...)` for each,
;; not sure if that would be better / performance / etc.
...
)
将所有字节加载到一个位置并循环显示它们?
或者可能有一种更标准的.data
功能,例如汇编(虽然我不确定这是否适合动态数据)。
(module
(data float16 memorylocation, 200.1)
(data float16 memorylocation, 200.2)
...
)
到目前为止,我了解如何在WebAssembly中执行 functions ,而不是如何处理初始化数据,因为它似乎会生成WebAssembly的 lot ,并且不确定应该是什么样的WebAssembly。
答案 0 :(得分:2)
WebAssembly二进制文件包含一个data segment部分,该部分在调用start
之前和实例开始运行之前复制到内存中。
C ++编译器会将.rodata
的等效项和.data
的任何其他静态初始化放在那里。然后可以在运行时修改它。