为什么32位x86 ABI中int64_t
(例如long long
)的默认对齐8字节? 4字节对齐似乎没问题,因为它只能作为两个4B半部分进行访问。
答案 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一般都不好。请参阅x86 wiki中的链接,尤其是Agner Fog的指南。