c - "memory is 8 bytes aligned"是什么意思?

标签 c memory-management memory-alignment

在完成一个项目时,我看到内存数据是“8 字节对齐”。谁能解释一下这是什么意思?

最佳答案

“8 字节对齐”的对象存储在 8 的倍数的内存地址中。

许多 CPU 只会从对齐的位置加载某些数据类型;在其他 CPU 上,这种访问速度更快。使用内存对齐还有其他几个可能的原因 - 如果没有看到代码,很难说出原因。


对齐访问速度更快,因为到内存的外部总线不是单字节宽——它通常是 4 或 8 字节宽(甚至更宽)。这意味着 CPU 不会一次获取一个字节 - 它会从请求的地址开始获取 4 或 8 个字节。因此,内存地址的 2 或 3 个最低有效位实际上并未由 CPU 发送 - 外部内存只能在总线宽度的倍数地址处读取或写入。如果您在地址“9”处请求一个字节,CPU 实际上会向内存询问从地址 8 开始的字节 block ,并将第二个字节加载到您的寄存器中(丢弃其他字节)。

这意味着未对齐的访问可能需要从内存中读取两次:如果您要求从地址 9 开始的 8 个字节,CPU 必须获取从地址 8 开始的 8 个字节以及第 8 个字节从地址 16 开始的字节,然后屏蔽掉你想要的字节。另一方面,如果您要求从地址 8 开始的 8 个字节,则只需要一次提取。有些 CPU 甚至不会执行这种未对齐的加载 - 它们只会引发异常(甚至静默加载错误数据!)。

关于c - "memory is 8 bytes aligned"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846914/

相关文章:

关于指向固定数组的指针的混淆

c++ - OpenSSL EVP_DigestSignFinal 段错误

c++ - "reserve"缓存部分是否有任何解决方法?

swift - 为什么某些类型(例如 Float80)的内存对齐大于字长?

c - 我尝试使用 'fork' 创建一个进程

c - 三爪分区(动态编程示例)

objective-c - ARC 在哪里写发布指令?

memory-leaks - 没有 GDI 泄漏的 VB6 内存泄漏

c++ - 'aligned pointer' 到底是什么?

java - Java类的内存对齐