“内存是8字节对齐”是什么意思?

问题描述 投票:0回答:4

在进行一个项目时,我发现内存数据是“8字节对齐”的。谁能解释一下这是什么意思?

c memory-management memory-alignment
4个回答
75
投票

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

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


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

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


21
投票


8
投票

在单元处理器中,数据必须按 16 字节对齐才能复制到协处理器或从协处理器复制。


3
投票

sizeof(the_data) % 8 == 0

一般在C语言中,如果一个结构体建议8字节对齐,那么它的大小必须是8的乘积,如果不是,则需要手动或编译器进行填充。有些编译器提供了指令来使结构体与n个字节对齐,对于VC来说是
#pragma pack(8)

,对于gcc来说是

__attribute__((aligned(8)))
    

© www.soinside.com 2019 - 2024. All rights reserved.