Memory 对齐规则
我的家庭作业有点问题,我想知道是否有人能给我指出正确的方向 假设我们正在编译一台机器 具有1字节字符,2字节 短路、4字节整数和8字节整数 reals,并使用对齐规则 需要每个原语的地址 数据元素是的偶数倍 元素的大小。进一步设想 不允许编译器 对字段重新排序。有多少空间 是否被以下数组消耗Memory 对齐规则,memory,location,alignment,rules,Memory,Location,Alignment,Rules,我的家庭作业有点问题,我想知道是否有人能给我指出正确的方向 假设我们正在编译一台机器 具有1字节字符,2字节 短路、4字节整数和8字节整数 reals,并使用对齐规则 需要每个原语的地址 数据元素是的偶数倍 元素的大小。进一步设想 不允许编译器 对字段重新排序。有多少空间 是否被以下数组消耗 A : array [0..9] of record s : short; c : char; t : short; d : char; r : real;
A : array [0..9] of record
s : short;
c : char;
t : short;
d : char;
r : real;
i : integer;
end;
现在我基本上理解了这个问题,但真正让我感到困惑的是“需要每个原始数据地址的对齐规则”
元素是元素大小的偶数倍”。我的书对对齐规则的描述不是很好,老实说,我甚至不知道偶数倍数是什么。任何帮助都将不胜感激
另外,我相信答案是240字节,我只是需要一些帮助。例如,短语“元素大小的偶数倍”
可能表示2字节的短字符必须在4字节边界上对齐
这对我来说似乎有点浪费,但既然是家庭作业,那当然是可能的
使用这些规则,您可以(对于大小为2的数组):
使用填充的原因是将每个数组元素设置为16的倍数,以便每个数组元素中的r
变量可以对齐到16个字节
因此,在这种情况下,10个数组元素将占用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字节的短字符必须具有偶数地址”,或“4字节的整数必须是4字节对齐的”。因此,地址为0x101到0x103的int是一个总线错误,但是0x100和0x104是正确的
“对齐规则”要求“每个基本数据元素的地址都是元素大小的偶数倍”。我们谈论对齐规则不是很有趣;我们早就知道了
要求“每个基本数据元素”的“地址”为“元素大小的偶数倍”。现在我们有进展了。我们有一个要求和范围:
Requirement: The address is an even multiple of the element's size.
Scope: Every primitive data element.
因此,每次我们定位一个元素时,都必须强制执行该要求
让我们尝试在内存中定位一个元素。我们首先要定位的是标签为s
的short
。因为一个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
到N+16
<代码>i
从N+16
到N+20
。(注意只有当我们将N限制为8的倍数时,这才有效,否则r
将不对齐。这是可以的;当我们为数组分配内存时,我们可以根据需要对齐数组的开头-我们只需在该点之后的数据顺序保持一致。)
因此,对于这个结构,我们需要至少20个字节。(这是半开放范围的优点之一:端点之间的差异等于大小。如果我们从范围中包括或排除两个端点,则必须进行+1或-1校正。)
现在让我们假设我们尝试将数组布局为10个20字节的连续块。这样行吗?不假设元素0位于地址256处(8的倍数)。现在元素1中的r
将不对齐,因为它将从256+20+8开始,不能被8整除。这是不允许的
那我们现在该怎么办?我们不能只在元素1中的r
之前插入额外的4个字节,因为数组的每个元素都必须具有相同的布局(更不用说大小)。但是有一个简单的解决方案:我们在每个元素的端插入4字节的额外填充。现在,只要数组以8的倍数开始,每个元素也将以8的倍数开始(这反过来会保持r
对齐),因为现在的大小是8的倍数
我们得出结论,结构需要24个字节,因此数组需要24*10=240个字节。你是想对paxdiablo的答案发表评论吗?
Requirement: The address is an even multiple of the element's size.
Scope: Every primitive data element.