一 .计算结构体的大小
首先我们来看一道例题:
structS1{ charc1; inti; charc2; }; structS2{ charc1; charc2; inti; }; intmain() { printf("%d\n", sizeof(structS1)); printf("%d\n", sizeof(structS2)); return0; }
如果没有了解过结构体内存对齐,我们很容易想到,char占1个字节,int占4个字节,S1总共占6个字节,S2占6个字节,打印的结果就是6和6,可当我们运行起来发现并不是,答案是12和8;
接下来我们就来讨论关于结构体在内存中是如何对齐的
二,关于结构体内存对齐规则
首先得掌握结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为 0 的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 。
VS 中默认的值为 8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
1)这里介绍一下偏移量和对齐数
偏移量:
我们把一个格子当做一个字节,最顶上那个位置我们叫做其实位置,相对偏移量为0的地方就是第一个格子,偏移量为1的地方就是第二个格子,以此类推,如图所示:
对齐数:
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,举个例子,vs中的默认对齐数是8,char是一个字节,char类型的最大对齐数就是1,int是4个字节,int类型的最大对齐数就是4,double是8个字节,double类型的最大对齐数就是8.