关于信息存储边界和字节对齐的疑问

就我目前理解的来说: 数据在内存中会根据字长的大小对其存储,如字长32位,则未满32位的数据会对齐填充使之达到32位,超过32位则会把超过的部分放到下一个32位中。
比如我有这样的数据: A(8字节) B(8字节) C(8字节) D(4字节) E(8字节)
那么对于字长32位的系统来说在内存中会被这样存储(下划线表示被划分在同一个32位的空间内):

A B C D [字节填充]  E XXXXXXXXXXXXXXX
-----------------  -----------------

而这样做的目的是读取数据的时候可以一次就读取到完整的数据,那么为什么读取的时候不能定位到需要读取的数据的起始地址呢?比如这样的排列的话(下划线表示地址上连续):

A B C D E
---------

那么当要读取数据E的时候,定位到E的起始地址再读取数据,这样同样可以一次性读取到所需的数据。
我的疑惑就在于为什么读取数据的时候不定位到目标数据的起始地址再读取?
请问目前我的理解是否有问题?

阅读 4.5k
3 个回答

首先你要知道数据对齐是编译器做的。它也可以不这么做。

为什么不定位到数据开头再读呢?因为字长是(比如说)8个字节啊,也就是说你只能定位到8的倍数的字节数那里。就像数据有八列N行,你一次只能读一整行,多出来的你就扔掉;你要的数据分到两行里了,你就读两次。

新手上路,请多包涵

这个对齐是编译器决定的,这样效率更高,你那样的定位还要计算偏移地址,效率不好

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进