在阅读一些内存对齐知识的帖子时,我对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个字节。
如果我想要c
和d
0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d| bytes
| | a word
读取1个字从address 4
开始并获取最后2个字节并丢弃前2个字节。
然后似乎不需要对齐,这绝对是不正确的..
我一定有误解或缺乏其他知识,请帮助纠正我..
“为什么不能(可以吗?)直接读取包含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.)