MS.*_*MS. 14 c processor alignment cpu-architecture
请原谅我,如果你觉得这已被无数次回答,但我需要回答以下问题!
为什么数据必须对齐(在4字节/ 8字节/ 2字节边界上)?这里我怀疑的是当CPU具有地址线Ax Ax-1 Ax-2 ... A2 A1 A0时,很可能顺序地寻址存储器位置.那么为什么需要在特定边界对齐数据呢?
在编译代码和生成可执行代码时如何找到对齐要求?
如果例如数据对齐是4字节边界,那是否意味着每个连续字节位于模4偏移处?我怀疑的是,如果数据是4字节对齐,那意味着如果一个字节是1004那么下一个字节是1008(或1005)?
Yan*_*min 14
CPU是面向字的,而不是面向字节的.在简单的CPU中,存储器通常被配置为每个地址选通返回一个字(32位,64位等),其中底部的两个(或更多)地址线通常是无关位.
对于许多指令,Intel CPU可以对非字边界执行访问,但是由于内部CPU执行两次存储器访问和一个数学运算来加载一个字,因此存在性能损失.如果您正在执行字节读取,则不应用对齐.
某些CPU(ARM或Intel SSE指令)需要对齐的内存,并且在进行未对齐访问(或抛出异常)时具有未定义的操作.它们通过不实现更复杂的加载/存储子系统来节省大量的硅空间.
对齐取决于CPU字大小(16,32,64位),或者在SSE的情况下取决于SSE寄存器大小(128位).
对于您的上一个问题,如果您一次只加载一个数据字节,则大多数CPU都没有对齐限制(某些DSP没有字节级指令,但可能您不会碰到一个).
很少有数据"有"对齐.更多的是某些类型的数据可能表现更好或某些cpu操作需要特定的数据对齐.
首先,假设您一次读取4个字节的数据.我们还说你的CPU有32位数据总线.我们还假设您的数据存储在系统内存中的字节2处.
既然你可以一次加载4个字节的数据,那么让你的地址寄存器指向一个字节并没有多大意义.通过使地址寄存器指向每4个字节,您可以操作4倍的数据.换句话说,您的CPU可能只能读取从字节0,4,8,12,16等开始的数据.
所以这就是问题所在.如果您希望数据从字节2开始并且您正在读取4个字节,则数据的一半将位于地址位置0而另一半位于位置1.
所以基本上你最终会打两次内存来读取你的一个4字节数据元素.某些CPU不支持此类操作(或强制您手动加载和组合这两种结果).
请访问此处了解更多详情:http://en.wikipedia.org/wiki/Data_structure_alignment
| 归档时间: |
|
| 查看次数: |
6216 次 |
| 最近记录: |