众所周知,X86 CPU 有 64 位的数据总线。我的理解是CPU不能访问任意地址。 CPU 可以访问的地址是其数据总线宽度的整数倍。为了性能,变量应该从(对齐到)这些地址开始,以避免额外的内存访问。对齐到 4Byte 边界的 32 位变量将自动对齐到 8Byte(64 位)边界,这对应于 x86 64 位数据总线。但为什么编译器将 128 位变量与 16 字节边界对齐?不是 8 字节边界?
谢谢
让我更具体一点。编译器使用变量的长度来对齐它。例如,如果一个变量的长度为 256 位,Complier 会将其对齐到 32 字节边界。我认为没有任何一种 CPU 具有那么长的数据总线。此外,普通的DDR内存一次只能传输64位数据,尽管有缓存,内存如何填满CPU更宽的数据总线?还是只能通过缓存?
最佳答案
一个原因是 X86 上的大多数 SSE2 指令要求数据 128 位对齐。出于性能原因并避免过于复杂(因此又慢又大)的硬件,本应做出此设计决定。
关于c++ - 为什么 128 位变量应该与 16 字节边界对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703211/