Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 对齐规则_Memory_Location_Alignment_Rules - Fatal编程技术网

Memory 对齐规则

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;

我的家庭作业有点问题,我想知道是否有人能给我指出正确的方向

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

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.