在浏览一个项目时,我看到内存数据是“8字节对齐”。任何人都可以解释这意味着什么?
答案 0 :(得分:37)
“8字节对齐”的对象存储在8的倍数的存储器地址中。
许多CPU只会从对齐的位置加载一些数据类型;在其他CPU上,这种访问速度更快。使用内存对齐还有其他几个可能的原因 - 没有看到代码就很难说出原因。
对齐访问速度更快,因为外部总线到内存的宽度不是单字节宽 - 通常为4或8字节宽(甚至更宽)。这意味着CPU一次不获取单个字节 - 它从请求的地址开始获取4或8个字节。因此,存储器地址的2或3个最低有效位实际上不是由CPU发送的 - 外部存储器只能在总线宽度的倍数的地址上读取或写入。如果您在地址“9”处请求了一个字节,CPU实际上会向存储器询问从地址8开始的字节块,并将第二个字节加载到您的寄存器中(丢弃其他寄存器)。
这意味着未对齐的访问可能需要从内存中进行两次读取:如果要求从地址9开始的8个字节,则CPU必须从地址8开始获取8个字节以及8个字节。从地址16开始的字节,然后掩盖你想要的字节。另一方面,如果要求从地址8开始的8个字节,则只需要一次提取。有些CPU甚至不会执行这样的错位负载 - 它们只会引发异常(甚至无声地加载错误的数据!)。
答案 1 :(得分:8)
内存对齐对于以不同方式的性能非常重要。它有硬件相关的原因。从80年代开始,CPU和内存之间的访问时间就不同了。处理器的速度增长速度超过内存速度。这种差异随着时间的推移变得越来越大(举个例子:在Apple II上,CPU处于1.023 MHz,内存频率为两倍,CPU为1个周期,视频为1个周期。现代PC工作正常在CPU上大约3GHz,内存只有400MHz)。解决内存不断减慢问题的一种解决方案是在更宽的总线上访问它,而不是一次访问1个字节,CPU将从内存中读取64位宽的字。这意味着即使您从内存中读取1个字节,总线也将提供整个64位(8字节字)。存储器将在地址0,8,16,24,32,40等处具有这8字节单元.8的倍数。如果访问,例如地址4处的8字节字,则硬件将必须读取该字在地址0处,屏蔽该字的高4字节,然后读取地址8处的字,屏蔽该字的低部分,将其与前半部分组合并将其提供给寄存器。你可以看到一个非常复杂(因此很慢)的操作。这是人们喜欢对齐内存访问的第一个原因。我将在2小时内给出另一个理由。
答案 2 :(得分:5)
“X字节对齐”表示数据的基址必须是X的倍数。它可以用于在某些特殊硬件中使用某些特殊硬件,如DMA,以便更快地访问cpu等。 ..
Cell处理器的情况是数据必须对齐16个字节才能复制到协处理器或从协处理器复制。
答案 3 :(得分:1)
如果内存数据是8字节对齐,则表示:
sizeof(the_data) % 8 == 0
。通常用C语言,如果建议一个结构是8字节对齐,它的大小必须是8的乘法,如果不是,则需要手动或通过编译器填充。一些编译器提供指令以使结构与n个字节对齐,对于VC,它是#prgama pack(8)
,对于gcc,它是__attribute__((aligned(8)))
。