为什么那些“加载”和“存储”运算符需要“对齐”属性,它如何与内存对齐一起工作?
顺便说一下,为什么我们需要这个操作符,因为底层系统会自动为我们做内存对齐?答案 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。