关于内存对齐示例的困惑

问题描述 投票:1回答:1

在阅读一些内存对齐知识的帖子时,我对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的每一半。

为什么不能(可以吗?)直接读取包含b的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

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

如果我想要cd

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

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

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


我一定有误解或缺乏其他知识,请帮助纠正我..

c memory memory-alignment
1个回答
1
投票

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

wordboundary(仅适用于上述平台)是wordwidth的干净倍数。 0,4,8,12 ......但不是2,6,10 ......

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

© www.soinside.com 2019 - 2024. All rights reserved.