请牢记以下3条原则:(在没有#pragma pack宏的情况下)
1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。
2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。
3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍,不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。
#include <iostream>
using namespace std;
struct X1
{
int i;//4个字节
char c1;//1个字节
char c2;//1个字节
};
struct X2 {
char c1;//1个字节
int i;//4个字节
char c2;//1个字节
};
struct X3
{
char c1;//1个字节
char c2;//1个字节
int i;//4个字节
static int t;
static double t1;
};
int X3:: t =0;
double X3:: t1 =0.0;
struct X4 {
int a;
char b;
short c;
char d;
};
struct inner
{
char c1;
double d;
char c2;
};
int main()
{
cout<<"long "<<sizeof(long)<<"\n";
cout<<"long long"<<sizeof(long long)<<endl;
cout<<"double"<<sizeof(double)<<endl;
cout<<"int "<<sizeof(int)<<"\n";
cout<<"char "<<sizeof(char)<<"\n";
X1 x1;
X2 x2;
X3 x3;
X4 x4;
cout<<"x1 的大小 "<<sizeof(x1)<<"\n";
cout<<"x2 的大小 "<<sizeof(x2)<<"\n";
cout<<"x3 的大小 "<<sizeof(X3)<<"\n";
cout<<"x4 的大小 "<<sizeof(x4)<<"\n";
cout<<"inner 的大小 "<<sizeof(inner)<<"\n";
return 0;
}