首页 > 解决方案 > 我应该如何在 Wasm 内存中存储连续的 f64 值?

问题描述

我正在编写一个直接输出 Wasm的小型编译器。在我的源语言中,所有值都是f64s,它们可以按索引写入(和读出)固定大小的缓冲区。

我正在尝试使用(?)Wasm 内存来存储该缓冲区。

在内存中存储连续f64值时,我应该在运行时通过将索引乘以 an 的字节大小来推导地址,还是可以使用/f64以某种方式实现这一点?alignoffset

在我最初的方法中(回想起来很愚蠢)假设我可以只使用连续的索引,并且不知何故我正在使用它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规范可以在这里找到。

标签: webassembly

解决方案


在内存中存储连续的 f64 值时,我应该在运行时通过将索引乘以 f64 的字节大小来推导地址,还是我可以使用对齐/偏移以某种方式实现这一点?

不,您无法通过对齐/偏移来获得它。

您必须将所有索引乘以 8(因为 f64 是 64 位 / 8 位 = 8)。

您可以在每次内存访问中直接执行此操作,或者另一种方式是定义两个实用函数:

  • (结果 f64)myload(索引 i32)和
  • () mystore(i32 索引,f64 值)

然后这些函数将在 index*8 处进行加载/存储。


推荐阅读