C++内存对齐原则
(1)在没有#pragam pack宏的情况下,struct/class/union内存对齐原则有四个:
- 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的位置,以后每个数据成员存储的起始位置都是放在该数据成员大小的整数倍位置。如在32bit的机器上,int的大小为4,因此int的存储位置都是从4的整数倍的位置开始存储的。
- 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部“最宽基本类型成员”的整数倍地址开始存储(struct a里面有struct b,b里面有char、int、double等元素,那b应该从8的整数倍位置开始存储)。
- 收尾工作:结果体的总大小,也就是sizeof的结果,必须是其内部最大成员的“最宽基本类型成员”的整数倍,不足时要补齐。(基本类型不包括struct、class、union)
- sizeof(union),以结构里面size最大元素为union的size,因为在某一个时刻,union只有一个成员真正存储于该地址。
举例说明一下:
class A
{
char a;
int b;
};
class B
{
char c;
double d;
};
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
上例输出结果为8和16,原因是A的最大数据元素为int,大小为4,补齐之后为1+(3)+4 = 8;B的最大数据元素为double,大小为8,补齐之后为1+(7)+8=16.