结构体

来源:互联网 发布:mac系统误删文件 编辑:程序博客网 时间:2024/06/05 07:18

解析结构体、位段

1.结构的定义

结构可以把有内在联系的不同类型的数据汇聚成一个整体,使他们相互关联;同时,结构又是一个变量的集合,可以按照对基本数据类型的操作方法单独使用其成员变量。结构就是这样一种特殊的构造数据类型。

结构类型定义的一般形式:

struct 结构名
{
类型名  结构成员1;
类型名  结构成员2;
.......
类型名  结构成员n;
};

2.结构的初始化

结构的初始化和数组的初始化很类似。在位于一个花括号内部,根据结构成员列表的顺序写出与各个成员相对应的初始值,且每个初始值之间用逗号隔开。
例:
struct S
{
char name[20];
int age;
double score;
}s = {"zhang",13,89.6};

3.结构体的typedef

使用关键字typedef可以对结构体类型声明一个新的名字,便于程序员在之后的使用。
例:
typedef struct S
{
char name[20];
int age;
double score;
}s;

4.结构体的内存存储(内存对齐规则,为什么存在内存对齐?)


结构体内存对其原则:

1)第一个成员在与结构体变量偏移量为0的地址处。

2)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数=编译器默认的一个对齐数与该成员大小的较小值。

VS中默认的值为8

gcc中默认的值为4

3)结构体的总大小为最大对齐数(每个成员变量除了第一个成员变量都有一个对齐数)的整数倍。

4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


对齐原因:

1)平台原因(移植原因):不是所有的硬件平台都能访问到任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问只需要一次访问就可以了。

5.结构实现位段,位段大小的计算。位段的数据存储。

位段成员必须声明为int,signed int和unsigned int,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用位的个数。
例:


存储方式:第二个位段无法放到第一个位段剩余的位上时,编译器就会把第二个位段放到下一个字节上。


原创粉丝点击