结构体:
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的集合。因为这一特性,方便了开发者在使用的过程中可以将需要的不同的数据类型放在一起,做成我们需要的数据类型,通过结构体封装一些属性来组成新的类型。在我们实现链表的时候也很好的体现了这一点
但是,结构体在使用的过程中需要格外的注意!!!
结构体的大小及对齐规则:
结构体的大小不是结构体体中数据简单的相加,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效、方便。这就是内存对齐的由来。
每个平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。开发者也可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,n为指定的“对齐系数”。
结构体对齐规则:
1、结构体(struct)的数据成员,第一个数据成员放在offset为0的位置,以后每个数据成员在对齐数的整数倍的位置。
对齐数=编译器默认的对齐数与该成员大小的较小值。
VS中默认对齐数为8,linux默认对齐数为4.
2、结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍。
3、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
struct A
{
int a;
char b;
double c;
};
//sizeof(A)=16;
struct B
{
char b;
double c;
int a;
};
//sizeof(B)=24
struct A和struct B里面的数据除了顺序不同,里面的数据是一样的,但是编译之后发现它们的结构体长度是不一样的。所以数据的顺序不同结构体的对齐方式也不同,结构体的大小自然不同
struct A :a是4字节,b是1字节,不符合对齐规则,所以b自动补全3个字节刚好和a加起来是8字节完成对齐,c是8字节,所以加起来是16字节
struct B :b是一个字节,不符合对齐规则,不全7个字节完成对齐,c是8个字节,b是4个字节,不符合对齐规则,不全4个字节完成对齐,所以struct B的大小是24