如何理解WebAssembly中的“align”属性?

时间:2018-03-18 06:29:40

标签: webassembly

为什么那些“加载”和“存储”运算符需要“对齐”属性,它如何与内存对齐一起工作?

顺便说一下,为什么我们需要这个操作符,因为底层系统会自动为我们做内存对齐?

2 个答案:

答案 0 :(得分:1)

使用对齐在规范中详细说明:

  

加载和存储指令中的对齐memarg.不会影响语义。这表明访问内存的偏移量ea旨在满足属性ea mod 2^memarg.=0。 WebAssembly实现可以使用此提示来针对预期用途进行优化。仍允许违反该属性的未对齐访问,无论注释如何,都必须成功。但是,在某些硬件上可能会慢得多。

没有与对齐相关的其他语义效果;未对齐和未对齐的加载和存储仍然表现正常,它只是一种性能优化。

答案 1 :(得分:0)

向VM承诺(baseAddr + memarg.offset) mod 2^memarg.align == 0,其中baseAddr是参数形式堆栈。

换句话说,我们实际上是将内存按大小2^memarg.align个字节的块进行划分,并向VM保证我们的实际地址(baseAddr + memarg.offset)将在任何块的开头,而不是在中间。

由于memarg.align的最大值是3,所以一个块的大小(以字节为单位)可以是{1、2、4、8}的整数(1 = 2 ^ 0,..,8 = 2 ^ 3)。

此外,您可以找到很好的详细说明here