webassembly - 我应该如何在 Wasm 内存中存储连续的 f64 值?
问题描述
我正在编写一个直接输出 Wasm的小型编译器。在我的源语言中,所有值都是f64
s,它们可以按索引写入(和读出)固定大小的缓冲区。
我正在尝试使用(?)Wasm 内存来存储该缓冲区。
在内存中存储连续f64
值时,我应该在运行时通过将索引乘以 an 的字节大小来推导地址,还是可以使用/f64
以某种方式实现这一点?align
offset
在我最初的方法中(回想起来很愚蠢)假设我可以只使用连续的索引,并且不知何故我正在使用它f64.store
并且f64.load
它会“正常工作”。
它看起来像这个.wat
文件:
(module
(memory 1)
(func (result f64)
;; Write 0 to index 99
i32.const 99
f64.const 0
f64.store
;; Write 1 to index 100
i32.const 100
f64.const 1
f64.store
;; Read from 99
i32.const 99
f64.load
)
(export "run" (func 0))
)
我希望这会输出0
,但-3.105036184601418e+231
我认为它的输出是因为我在索引 99 开始读取时正在读取的一些字节是在我写入索引 100 时才写入的。
上述.wat
文件的“正确”版本(将两个连续f64
值存储到内存中然后读取一个)看起来像什么?
官方f64.load
/f64.store
规范可以在这里找到。
解决方案
在内存中存储连续的 f64 值时,我应该在运行时通过将索引乘以 f64 的字节大小来推导地址,还是我可以使用对齐/偏移以某种方式实现这一点?
不,您无法通过对齐/偏移来获得它。
您必须将所有索引乘以 8(因为 f64 是 64 位 / 8 位 = 8)。
您可以在每次内存访问中直接执行此操作,或者另一种方式是定义两个实用函数:
- (结果 f64)myload(索引 i32)和
- () mystore(i32 索引,f64 值)
然后这些函数将在 index*8 处进行加载/存储。
推荐阅读
- java - 左对齐使用 printf 右对齐字符串的第一行
- excel - 如果Excel中的单元格为空白,如何隐藏行?并在下面添加新行
- laravel - 数据库查询在本地主机上工作正常,但在服务器上不能正常工作
- python - 在循环中根据字符将字符串拆分为数组
- javascript - 全球连续3分钟倒计时
- c# - 试图创建一个唯一的随机数。如果数据库中的数字退出再次生成并向数据库添加值
- android - Google Play - 提交例外并推出提交
- java - 在 VS Code 中导入 .jar 库
- java - 如何将此java代码转换为流程图
- varnish - 使用 MPEG-TS 流量清漆