1 数据成员对齐,结构体(或联合体)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数 倍开始(比如int在32位机 为4字节,则要从4的整数倍地址开始存储)。
2 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
3 结构体作为成员,如果 一个 结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct b里面有struct a,a里面有char,int,double等元素,那么a应该从8的整数倍开始存储)。
结构体的对齐
在sizeof计算一个结构体的大小时,经常得到的值比结构体内部成员所占内存总和要大,这就是因为在结构体内部,成员在存储时有对齐的规则。结构体对齐指的是 : 编译器向结构体插入无用内存的能力,插入无用内存使得结构体成员以最佳方式对齐,从而得到更高的效能。当基本数据类型以字节地址(几倍于自身大小)存储时,很多处理器能够获得最佳效能。
以下是几个例子:
Struct x
{
};
Struct y
{
};
Struct z
{
};
Sizeof(x)=12;
X的内存布局:
Y的内存布局:
Z的内存布局:
其中*表示填充的字节,x中s后面为什么 要填充两个 字节?因为i是整型,其起始位置要为4的倍数。C后面要填充3个字节,因为结构体size要为4(即最大类型 ——整型sizeof(int))的倍数。
Y中C后面填充一个 字节,因为s为short类型,起始位置要为2的倍数。S后面没有填充,因为c和s正好占用了4个字节。
Z中s后面没有填充,因为s和c正好占用4个字节,c填充一个字节 因为struct大小要为int的整数倍。
再看一个有结构体作为成员的例子:
Struct A
{
};
Struct B
{
};
Sizeof(A)=24; 因为 int为4,double为8,float为4,总长为8的 倍数,补齐,所以为24。 Sizeof(B)=48;看一下B的布局
B的内存布局:e