结构体的内存对齐
规则:
1.结构体的第一个成员永远都放在0偏移量处
2.从第二个成员开始,以后的每个成员都要对齐到某个对齐数的整数倍处
这个对齐数是:成员自身大小和默认对齐数的较小值
备注:
VS环境下 默认对齐数是8
gcc环境下 没有默认对齐数,没有默认对齐数时,对齐数就是成员自身的大小
3.当成员全部存放进去后
结构体的总大小必须是,所有成员的对齐数中最大对齐数的整数倍.
如果不够,则浪费空间进行对齐.
4.如果嵌套了结构体,嵌套的结构体成员要对齐到自己成员的最大对齐数的整数倍处.
整个结构体的大小,必须是最大对齐数的整数倍,最大对齐数包含嵌套的结构体成员中的对齐数
修改默认对齐数
#pragma pack(8)//设置默认对齐数为8
#pragma pack()//取消设置的默认对齐数,还原为默认
位段
位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。
位段的内存分配
- 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
- 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
- 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
枚举
枚举的优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
通讯录
实现一个通讯录:
1.可以存放100个人的信息
2.每个人的信息:
名字,性别,年龄,电话,地址
3.增加联系人
4.删除联系人
5.查找指定联系人
6.修改指定联系人
7.显示联系人信息
8.排序联系人(按照年龄/名字)
联合体
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间
特点:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)
计算:
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
使用联合体判断大小端
union Un
{
char c;
int i;
};
int main()
{
union Un u;
u.i=1;
if(u.c==1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}