caf*_*caf 43
"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甚至不会执行这种错位负载 - 它们只会引发异常(甚至无声地加载错误的数据!).
Pat*_*ter 11
内存对齐对于以不同方式的性能很重要.它有硬件相关的原因.从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小时内给出另一个理由.
"X字节对齐"意味着数据的基地址必须是X的倍数.它可以用于在某些特殊硬件中使用某些特殊硬件,如DMA,以便更快地访问cpu等...
单元处理器的情况是数据必须是16字节对齐,以便复制到协处理器或从协处理器复制.