版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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->c
、p->i[0]
和p->v
引用的都是数据结构的起始位置。一个联合的总的大小等于它最大字段的大小。
3.9.3 数据对齐
许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2
、4
或8
的倍数)。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。
K | 类型 |
---|---|
1 | char |
2 | short |
4 | int, float |
8 | long, double,chat* |
例如跳转表的汇编声明包含下列指令:
.align 8
这就保证了它后面的数据的起始地址是 8 的倍数。
示例:
蓝色部分为为对齐而填充的地址空间。
扫描二维码关注公众号,回复:
7608846 查看本文章