为什么32位x86架构上`int64_t` 8字节的默认对齐?

时间:2015-12-29 04:27:30

标签: c++ x86 memory-alignment

为什么32位x86 ABI中int64_t(例如long long)的默认对齐8字节? 4字节对齐似乎没问题,因为它只能作为两个4B半部分进行访问。

1 个答案:

答案 0 :(得分:1)

有趣的一点:如果您只将它作为两半加载到32位GP寄存器中,则4B对齐意味着这些操作将以自然对齐方式进行。

但是,如果变量的两半都在同一个高速缓存行中,那么最好是因为几乎所有的访问都会读/写两半。与整个事物的自然对齐保持一致可以解决这个问题,甚至忽略了下面的其他原因。

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

Atomic 64bit比较和交换也可以在32位模式下使用(lock CMPXCHG8B m64就像64位模式的lock CMPXCHG16B m128一样,使用两个隐式寄存器(edx:eax))。 IDK对于跨越缓存行边界会有什么样的惩罚。

现代x86 CPU对未对齐的加载/存储基本上没有任何惩罚,除非它们跨越缓存行边界,这就是为什么我只是这么说,而不是说错位64b一般都不好。请参阅 wiki中的链接,尤其是Agner Fog的指南。