【问题标题】:Confusion about a memory alignment example关于内存对齐示例的困惑
【发布时间】:2019-03-13 05:25:15
【问题描述】:

在阅读一些关于内存对齐知识的帖子时,我有一个关于What is aligned memory allocation?、@dan04 的好答案的问题。

阅读他给出的例子,

 0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d|  bytes
|       |       |  words

问题在于,在某些 CPU 架构上,从内存中加载 4 字节整数的指令仅适用于字边界。因此,您的程序必须使用单独的指令获取 b 的每一半。

为什么不能(可以吗?)直接读取包含@​​987654324@的4个字节(一个字,假设32位)?

例如,如果我想要b

 0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d|  bytes
    |       |      a word(assume it's 32 bit, get b directly)

读取从address 2开始的1个单词。

如果我想要a

 0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d|  bytes
|       |          a word

address 0开始读取1个字,获取前2个字节,丢弃后2个字节。

如果我想要cd

 0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d|  bytes
        |       |  a word

address 4开始读取1个字,获取最后2个字节,丢弃前2个字节。

然后似乎不需要对齐,这绝对是不正确的..


我一定是有什么误解或者缺乏其他知识,请大家帮忙指正..

【问题讨论】:

  • "为什么不能(可以吗?)直接读取包含 b 的 4 个字节(一个单词,假设 32 位)?您已经在上面引用的答案。关键是“关于词边界”。这与“字长”不同。 IE。这些 CPU 只能从 N*wordsize 中读取字长,而不能从 N*wordsize+2 中读取。
  • 因为硬件只允许从 4 的倍数的地址读取 4 字节
  • @Yunnosch 这是什么意思..? “在单词边界上”..这是否意味着例如32位CPU只能从地址0、4、8、16等读取?地址 0-3(1 个字),地址 4-7(1 个字)。
  • @Rick 就是这个意思。
  • 好的。谢谢你们……知道了。

标签: c memory memory-alignment


【解决方案1】:

“为什么不能(可以吗?)直接读取包含b的4个字节(一个字,假设32位)?”
您已经在上面引用的答案。关键是“关于字boundaries”。这与“字长”不同。 IE。这些 CPU 只能从 N*wordwidth 读取字宽,而不能从 N*wordwidth+2 读取。

字边界(仅适用于上述平台)是字宽的净倍数。 0, 4, 8, 12... 但不是 2, 6, 10...

从评论中提取你的措辞,是的。
这些 CPU 只能从地址 0、4、8、12、16 等读取。
例如。地址 0-3 一个字,地址 4-7 一个字。 (注意添加的 12。)

【讨论】:

  • 感谢 @Yunnosch 帮助我澄清这一点 ~~ ? 。在我阅读了所有相关帖子但仍然没有正确理解之后,这真是太痛苦了。现在感觉很好~;)
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2015-05-14
  • 2017-11-22
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多