对齐规则

时间:2010-12-07 07:31:09

标签: memory location alignment rules

我在做作业问题上遇到了一些麻烦,我想知道是否有人能指出我正确的方向。

  

假设我们正在为一台机器进行编译   1字节字符,2字节   短路,4字节整数和8字节   实数,以及对齐规则   需要每个原语的地址   数据元素是偶数倍   元素的大小。进一步假设   不允许编译器   重新排序字段。会有多少空间   由以下数组消耗?

A : array [0..9] of record
    s : short;
    c : char;
    t : short;
    d : char;
    r : real;
    i : integer;
end;

现在我理解这个问题,在很大程度上,但真正引发我循环的事情是“需要每个原始数据地址的对齐规则” 元素是元素大小的偶数倍。“在谈到对齐规则时,我的书并不是很清楚,而且说实话,我甚至不会对偶数倍数是正面的。任何帮助都会受到赞赏。

另外,我相信答案是240字节,我只需要一些帮助。

3 个答案:

答案 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会占用NN + 2之间的空间。 (注意:对于所有这些范围,包括第一个端点,但最后一个端点不包含。这是描述计算机科学中整数范围的常规方法;在大多数情况下,它是到目前为止最有用,最不容易出错的方式。相信我。)

我们继续相互领域。

c占用一个字节,从N + 2N + 3

我们在N + 3,但我们无法启动t,因为N + 3是奇数(因为N是偶数)。所以我们必须跳过一个字节。因此t的范围从N + 4N + 6

继续这种逻辑,我们最终得到d N + 6N + 7;从rN + 8的{​​{1}};从N + 16i的{​​{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是正确的