【发布时间】: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个字节。
如果我想要c 和d
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