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

发布于 2022-09-04 14:50:54 字数 529 浏览 22 评论 0

就我目前理解的来说: 数据在内存中会根据字长的大小对其存储,如字长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的起始地址再读取数据,这样同样可以一次性读取到所需的数据。
我的疑惑就在于为什么读取数据的时候不定位到目标数据的起始地址再读取?
请问目前我的理解是否有问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小耗子 2022-09-11 14:50:54

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

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

顾北清歌寒 2022-09-11 14:50:54

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

恏ㄋ傷疤忘ㄋ疼 2022-09-11 14:50:54

找到了比较详细的回答: stackoverflow上的回家

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文