目录

1.结构体进阶

计算结构体大小

计算结构体大小的示例(以下都是在vs编译器)

位段

位段的声明和结构是类似的,有俩个不同

位段的内存分配

枚举

枚举的使用

联合

联合体大小的计算

联合体大小的计算例子

1.结构体进阶

结构体关键字是struct

struct s2
{
	int num;
	int arr[13];
	char a;
	short d;
}

上面就是一个结构体,上面struct后面的名字s2这可以自己定

结构体成员的类型

结构体成员可以是标量,数组,指针,甚至是其他结构体

计算结构体大小

首先的掌握结构体对齐原则

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

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

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

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

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

vs编译器 默认的对齐数是——8

Linux环境没有默认对齐数的

没有对齐数的时候,自身的大小就是对齐数

计算结构体大小的示例(以下都是在vs编译器)

struct d
{
	int s;
	char as;
	int num;
};

这个结构体的大小为12。(如果想明白下面的为什么一定要看明白上面的4条规则)

为什么:首先第一个是int型的对齐数是4,vs默认是8,所以第一个对齐数是4,从0偏移量开始到3,下一个是char型的对齐数是1,vs默认是8,所以对齐数是1,此时偏移量是4,是1的倍数,所以就放在4,再下一个是int型的对齐数是4,vs默认是8,所以对齐数是4,但是现在偏移量是5,不是4的倍数,所以要到8偏移量开始,中间的5,6,7,都直接浪费了,4个,最后到了11偏移量,大小为12,最大对齐数是4,12是4的倍数所以最后的大小就是12。

---------------------------------------------------------------------------------------------------------------------------------

位段

位段的声明和结构是类似的,有俩个不同

1.位段的成员必须是int,unsigned int,signed int

2.位段的成员名后边有一个冒号和一个数字

位段的内存分配

1.位段的空间是按照需要以4个字节(int)或者一个字节(char)的方式来开辟的

2.位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段

struct d
{
	int _a : 2;//a这个成员只占2个bit位
	int _b : 5;//b这个成员只占5个bit位
	int _c : 10;
	int _d : 30;
};//8

位段是不会对齐的因为位段是为了节省空间

---------------------------------------------------------------------------------------------------------------------------------

枚举

枚举的优点

1.增加代码的可读性和可维护性

2.和#define定义的标示符比较枚举有类型检查,更加严谨

3.防止了命名污染(封装)

4.便于调试

5.使用方便,一次可以定义多个常量

枚举的使用

enum color//颜色
{
	RED = 1;
   CREEN = 2;
   BULE = 4;
};

就像这样同时可以定义多个变量,具体使用请自己探索

---------------------------------------------------------------------------------------------------------------------------------

联合

联合的成员是共用同一块空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存那个成员)

联合体大小的计算

1.联合大小至少是最大成员的大小

2.当最大成员大小不最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

联合体大小的计算例子

union as
{
	char arr[10];
	int a;
};

这个联合体大小是12

为什么:首先第一个是一个char型数组大小是10,从0开始,到9偏移量,这里第二个是int型大小是4但是并不是从10偏移量,而是又从0开始,到3偏移量,总大小是10,但是还没有结束,因为这里的最大对齐量是4,而10不是4的倍数,所以扩大至12,最后大小就为12。