深入理解计算机系统——第三章—3.9异质的数据结构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40199047/article/details/102676239

3.9 异质的数据结构

C语言提供了两种将不同类型的对象组合到一起创建数据类型的机制:
结构(structure),用关键字struct来声明,将多个对象集合到一个单位中;
联合(union),用关键子union来声明,允许用几种不同的类型来引用一个对象。

3.9.1 结构

C语言的struct声明创建一个数据类型,将可能不同类型的对象聚合到一个对象中。用名字来引用结构的各个组成部分。

示例:
这里写图片描述
另外,我们可以在一条语句中既声明变量又初始化它的手段:

struct rect r = {0, 0, 10, 20, 0xFF00FF};
返回长方形面积的示例:

long area(struct rect *rp)
{
    return (*rp).width * (*rp).height;
}

rp -> width 等价于 (*rp).width

示例:

struct rec {
	int i;
	int j;
	int a[2];
	int *p;
};

在这里插入图片描述示例:

Registers: r in %rdi
r->j = r->i

movl	(%rdi), %eax		Get r->i
movl	%eax, 4(%rdi) 	Store in r->j

Registers: r in %rdi, i in %rsi
&(r->a[i])

leaq	8(%rdi, %rsi, 4), %rax		Set %rax to &r->a[i]

Registers: r in %rdi
r->p = &r->a[r->i + r->j ];

movl	4(%rdi), %eax		Get r->j
addl	(%rdi), %eax		Add r->i
cltq						Extend to 8 bytes
leaq	8(%rdi, %rax, 4), %rax		Compute &r->a[r->i + r->j]
movq	%rax, 16(%rdi)		Store in r->p

3.9.2 联合

联合允许以多种类型来引用一个对象。
考虑如下声明:

struct S3
{
  char c;
  int i[2];
  double v;
}
union U3
{
  char c;
  int i[2];
  double v;
}

这里写图片描述
可以看出 类型 union U3 * 的指针 p,p->cp->i[0]p->v引用的都是数据结构的起始位置。一个联合的总的大小等于它最大字段的大小

3.9.3 数据对齐

许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是248的倍数)。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。

K 类型
1 char
2 short
4 int, float
8 long, double,chat*

例如跳转表的汇编声明包含下列指令:
.align 8
这就保证了它后面的数据的起始地址是 8 的倍数。
示例:
这里写图片描述
蓝色部分为为对齐而填充的地址空间。

扫描二维码关注公众号,回复: 7608846 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_40199047/article/details/102676239