c++ - 为什么 128 位变量应该与 16 字节边界对齐

标签 c++ c memory-management assembly x86

众所周知,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/

相关文章:

c++ - 为设置比较器获取 "Debug Assertion Failed!"

c++ - 使用数字标识符注册类类型

C:指针算术 - 它是如何工作的?

c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数

c++ - 使用 C 和/或 C++ 在内存中创建和管理字节缓冲区,该缓冲区可以根据需要自动调整大小

javascript - Dom Object被移除后,MS Edge的总内存使用量如何持续增长?

c++ - 是否可以将内联函数的声明和定义分开?

c++ - 从我的程序通过 gui 控制其他应用程序

c - 转移/减少 Bison 中的冲突

javascript - express/node.js API 中的高效服务器端 JavaScript 内存管理