我在做作业问题上遇到了一些麻烦,我想知道是否有人能指出我正确的方向。
假设我们正在为一台机器进行编译 1字节字符,2字节 短路,4字节整数和8字节 实数,以及对齐规则 需要每个原语的地址 数据元素是偶数倍 元素的大小。进一步假设 不允许编译器 重新排序字段。会有多少空间 由以下数组消耗?
A : array [0..9] of record s : short; c : char; t : short; d : char; r : real; i : integer; end;
现在我理解这个问题,在很大程度上,但真正引发我循环的事情是“需要每个原始数据地址的对齐规则” 元素是元素大小的偶数倍。“在谈到对齐规则时,我的书并不是很清楚,而且说实话,我甚至不会对偶数倍数是正面的。任何帮助都会受到赞赏。
另外,我相信答案是240字节,我只需要一些帮助。
答案 0 :(得分:3)
让我们打破这一点:
“对齐规则”,“要求每个原始数据元素的地址是元素大小的偶数倍”。我们谈论对齐规则并不是很有趣;我们已经知道了。
“要求每个原始数据元素的地址”为“元素大小的偶数倍”。现在我们到了某个地方。我们有一个要求和范围:
Requirement: The address is an even multiple of the element's size.
Scope: Every primitive data element.
因此,每次我们定位元素时,都必须强制要求。
让我们尝试将元素放在内存中。我们要定位的第一件事是short
标记为s
。由于short占用2个字节的内存,并且我们必须使其地址为该大小的倍数,因此地址必须是2的倍数。让我们称该地址为N.
因此,s
会占用N
到N + 2
之间的空间。 (注意:对于所有这些范围,包括第一个端点,但最后一个端点不包含。这是描述计算机科学中整数范围的常规方法;在大多数情况下,它是到目前为止最有用,最不容易出错的方式。相信我。)
我们继续相互领域。
c
占用一个字节,从N + 2
到N + 3
。
我们在N + 3
,但我们无法启动t
,因为N + 3
是奇数(因为N
是偶数)。所以我们必须跳过一个字节。因此t
的范围从N + 4
到N + 6
。
继续这种逻辑,我们最终得到d
N + 6
到N + 7
;从r
到N + 8
的{{1}};从N + 16
到i
的{{1}}。 (注意这只有在我们将N限制为8的倍数或N + 16
未对齐时才有效。这没关系;当我们为数组分配内存时,我们可以对齐然而,我们想要它的开始 - 我们只需要在该点之后对数据序列保持一致。)
因此,此结构需要至少 20个字节。 (这是半开放范围的优势之一:端点之间的差异等于大小。如果我们在范围内包含或排除两个端点,我们必须进行+1或-1校正。)
现在假设我们尝试将数组布局为10个连续的20个字节的块。这会有用吗?没有;假设元素0在地址256(8的倍数)。现在元素1中的N + 20
将是未对齐的,因为它将从256 + 20 + 8开始,不能被8整除。这是不允许的。
那我们现在该怎么办?我们不能在元素1中的r
之前插入额外的4个字节,因为数组的每个元素必须具有相同的布局(更不用说大小)。但是有一个简单的解决方案:我们在每个元素的 end 处插入4个字节的额外填充。现在,只要数组以8的倍数开始,每个元素也将以8的倍数开始(反过来,保持r
对齐),因为大小现在是8的倍数。 / p>
我们得出结论,结构需要24个字节,因此数组需要24 * 10 = 240个字节。
答案 1 :(得分:2)
例如,短语"an even multiple of the element’s size"
可能表示必须在4字节边界上对齐2字节短路。
这对我来说似乎有点浪费,但是,因为它是家庭作业,所以它当然是可能的。
使用这些规则(对于大小为2的数组):
Offset Variable Size Range
------ -------- ---- -----
0 s 2 0-1
4 c 1 2-2
8 t 2 4-5
12 d 1 6-6
16 r 8 16-23
24 i 4 24-27
28 * 4 28-31
32 s 2 32-33
34 c 1 34-34
36 t 2 36-37
38 d 1 38-38
48 r 8 48-55
56 i 4 56-59
60 * 4 60-63
你有填充的原因是使每个数组元素达到16的倍数,这样每个数组中的r
变量可以对齐到16个字节。
因此,在这种情况下,十个数组元素将占用320个字节。
它也可能意味着“均匀”,而不是“整数”而不是“两个的倍数”(因为它与现实相匹配的可能性更大)。
那会产生数组:
Offset Variable Size Range
------ -------- ---- -----
0 s 2 0-1
4 c 1 2-2
8 t 2 4-5
12 d 1 6-6
16 r 8 8-15
24 i 4 16-19
28 * 4 20-23
32 s 2 24-25
34 c 1 26-26
36 t 2 28-29
38 d 1 30-30
48 r 8 32-39
56 i 4 40-43
60 * 4 44-47
在这种情况下,每个元素有24个字节,总共240个字节。同样,您需要填充以确保r
正确对齐。
答案 2 :(得分:0)
我不同意 - 我读"an even multiple of the element’s size"
为“2字节短路必须有偶数地址”,或“4字节整数必须是4字节对齐”。因此,地址0x101 to 0x103
处的int是总线错误,但0x100和0x104是正确的