字节对齐原理:按照操作系统位数来进行对齐。如果当前剩余字节数能装不接下来的数据,则需要进行对齐后再装入新的数据。
下面是64位系统的输出 默认按照#pragma pack(8) 指针大小8个字节
struct A
{
int a;
float b;
char c;
double d;
int *pa;
char *pc;
};
int a= offsetof(A, a);//0
int b= offsetof(A, b);//4
int cb= offsetof(A, c);//8
int bd= offsetof(A, d);//16 4+4+1=9,但是对齐是8,1个字节装不下double,所以应该从8字节对齐后进行装载。
int e= offsetof(A, pa);//24
int fb= offsetof(A, pc);//28
int bg= sizeof(A);//32 //对齐是8,现在还剩下4个字节需要补齐,保证/8=整数
下面是32位系统的输出 默认按照#pragma pack(8) 指针大小4个字节
struct A
{
int a;
float b;
char c;
double d;
int *pa;
char *pc;
};
int a= offsetof(A, a);//0
int b= offsetof(A, b);//4
int cb= offsetof(A, c);//8
int bd= offsetof(A, d);//12 4+4+1=9,但是对齐是4,1个字节装不下double,所以应该从4字节对齐后进行装载。
int e= offsetof(A, pa);//20
int fb= offsetof(A, pc);//24
int bg= sizeof(A);//28 //最大字节是4,28/4刚好整除