为什么32位x86 ABI中int64_t(例如long long)的默认对齐方式为8个字节? 4字节对齐似乎很好,因为只能将其作为两个4B一半来访问。

最佳答案

有趣的一点:如果您只将其分成两半加载到32位GP寄存器中,则4B对齐意味着这些操作将自然对齐。

但是,最好是将变量的两个部分都放在同一缓存行中,因为几乎所有访问都会读取/写入两个部分。与整个事物的自然对齐保持一致可以解决这一问题,甚至可以忽略以下其他原因。

32位x86可以使用MMX或SSE2 movq在单个64位加载中加载64位整数。只要您不需要立即常数或mul或div,使用 vector 指令处理64位add / sub / shift /和按位 bool(boolean) 值的效率就更高(单指令)。具有64b元素的 vector 指令在32b模式下仍然可用。

原子64位比较和交换也可以在32位模式下使用(lock CMPXCHG8B m64的工作方式类似于64位模式的lock CMPXCHG16B m128,使用两个隐式寄存器(edx:eax))。 IDK对跨越高速缓存行边界有什么样的惩罚。

除非它们跨越缓存行边界,否则现代x86 CPU基本上不会对未对齐的加载/存储进行任何惩罚,这就是为什么我只是这么说而不是未对齐的64b通常不好。请参见x86 Wiki中的链接,尤其是。 Agner Fog的指南。

关于c++ - 为什么在32位x86架构上 `int64_t` 8字节的默认对齐方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34504421/

10-11 16:42