2

以下是红龙书的节选。

例 7.3。图 7.9 是 C 编译器对我们称为Machine 1和的两台机器使用的数据布局的简化图Machine 2

Machine 1: 的内存Machine 1被组织成字节,每个字节由 8 位组成。即使每个字节都有一个地址,指令集也倾向于将short整数定位在地址为偶数的字节上,而将整数定位在可被4. 编译器将短整数放置在偶数地址,即使它必须在进程中跳过一个字节作为填充。因此,由32位组成的四个字节可以分配给后跟一个短整数的字符。

Machine 2每个字由64位组成,字24的地址允许位。64单词中的各个位存在可能性,因此6需要额外的位来区分它们。按照设计,指向字符的指针Machine 2占用30位 —24查找单词以及6字符在单词中的位置。指令集的强字定向Machine 2导致编译器一次分配一个完整的字,即使更少的位足以表示该类型的所有可能值;例如,只8需要位来表示一个字符。因此,在对齐下,图 7.9 显示64每种类型的位。在每个字中,每种基本类型的位都在指定的位置。由位组成的两个字128将分配给后跟一个短整数的字符,字符仅使用8第一个字中的位,而短整数仅使用24第二个字中的位。□</p>

图

我在这里这里这里发现了对齐的概念。我可以从中了解到如下: 在字可寻址 CPU(大小超过一个字节)中,在数据对象中引入了某些填充,以便 CPU 可以以最少的数量有效地从内存中检索数据。的记忆周期。

现在Machine 1这里实际上是一个字节地址一。并且规范中的条件可能比具有说字节Machine 1字长的简单字可寻址机器更困难。4在这样的64位机中,我们需要确保我们的数据项只是字对齐,没有更多的困难。但是如何在像Machine 1(如上表中给出的)这样的系统中找到对齐,其中字对齐的简单概念不起作用,因为它是字节可寻址的并且具有更困难的规范。

此外,我发现在行中double类型的大小比对齐字段中给出的要多,这很奇怪。不应该alignment(in bits) ≥ size (in bits)吗?因为对齐是指实际为数据对象分配的内存(?)。

“每个字由64位组成,字的地址允许位。字中的各个位24有可能,因此需要额外的位来区分它们。根据设计,指向字符的指针占用位——找到单词和单词中字符的位置。” 646Machine 230246- 此外,这个关于指针概念的陈述应该如何可视化,基于对齐(2^6 = 64,很好,但是这 6 位与对齐概念有什么关系)

4

1 回答 1

2

首先,机器 1 一点也不特别——它与 x86-32 或 32 位 ARM 完全一样。

此外,我觉得很奇怪,在行中,类型的大小比对齐字段中给出的要多。不应该对齐(以位为单位)≥大小(以位为单位)吗?因为对齐是指实际为数据对象分配的内存(?)。

不,这不是真的。对齐意味着对象中最低可寻址字节的地址必须能被给定的字节数整除。

此外,对于C数组 sizeof (ElementType)内也需要大于或等于每个成员的对齐方式并且 sizeof (ElementType)可以被对齐方式整除,因此脚注 a。因此在后一台计算机上:

 struct { char a, b; }

可能有 sizeof 16因为字符在不同的可寻址单词中,而

struct { char a[2];  }

可以压缩成 8 个字节。


这个关于指针概念的陈述应该如何可视化,基于对齐方式(2 ^ 6 = 64,很好但是这6位与对齐概念有什么关系)

至于字符指针,6 位是假的。需要 3 位来选择8字节字中的8 个字节之一,所以这是书中的错误。一个普通的字节只会选择一个 24 位的字,而一个字符(一个字节)指针会选择一个 24 位的字,而字内的一个 8 位字节会选择一个3位的字。

于 2021-03-31T08:32:16.803 回答