结构体内存对齐规则
结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体也有自己的大小,但是结构体的大小并不是简单的将结构体成员的大小相加就可以得到的。
结构体的大小计算遵循结构体的对齐规则:
-
第一个成员在与结构体变量偏移量为0的地址处。
-
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 -
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
-
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数 倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。
注意:vs中的默认对齐数为8,不是所有编译器都有默认对齐数,当编译器没有默认对齐数的时候,成员变量的大小就是该成员的对齐数。
结构体大小计算 - 三步
计算结构体的大小分成三步,我们拿下面这个结构体举例。
struct S
{
double b;
char c;
int a;
};
第一步:找出每个成员变量的大小与编译器默认对齐数相比较,取其较小值为该成员变量的对齐数。
注意:我使用的是VS编译器,默认对齐数是8。
第二步:
根据每个成员对应的对齐数画出它们在内存中的相对位置。
第三步:通过最大对齐数决定最终结构体的大小。
通过图我们可以知道,绿色部分