【发布时间】:2020-01-08 23:37:52
【问题描述】:
我正在尝试在我的 C++ 代码中将 IEEE 754 浮点数/双精度数序列化为字节数组,然后将其编译为 WebAssembly。 (然后此代码作为 eosio 智能合约运行,但我认为这不相关)
我的问题是,我发现在 C++ 中工作的每个解决方案在将其编译到 WebAssemby 后都不再工作,给我错误 cause: access violation\n${callstack}
我尝试了 unions、reinterpret_cast 和 memcpy,所有这些都给了我上面看到的错误。我不太了解 Webassembly 是如何工作的,但我有根据的猜测是 Webassembly 不允许像 C++ 那样直接访问内存,因此编译器没有适当的方法来翻译“标准”C++ 解决方案。
你知道解决这个问题的任何方法吗?是否有可能在不使用任何直接访问内存的解决方案的情况下序列化数组的 C++ 库?如果没有,您对如何解决这个问题有什么想法吗?
【问题讨论】:
-
一个简单的代码示例演示该问题很可能有助于为您的问题获得令人信服的答案。
-
从技术上讲,C++ 标准不允许所有这些(memcpy 除外),因此允许顽固地实现。 C++ 不“允许直接内存访问”,实际上 ti 使用称为“存储”的内存模型抽象
-
最简单 - 虽然不是最有效 - 序列化浮点数的可移植方法是将它们转换为字符串(使用科学记数法)。我希望这可以在 webasm 中工作。如果我们不知道您的代码,我们无法判断您的代码有什么问题。
-
我在 gcc 和 emcc + 节点中运行了这个 memcpy 测试,它们产生了相同的输出:godbolt.org/z/JJ3oKF
-
@eerorika:十进制科学记数法不是序列化浮点值的可移植方式,因为 C 和 C++ 实现不需要在实现之间进行相同的舍入。如果浮点基数是 2 的倍数,则
printf说明符%a或hextfloat操纵器提供可移植的序列化,因为转换需要正确。它们在计算上也比十进制科学转换更容易,因此性能更好。
标签: c++ serialization floating-point ieee-754 webassembly