#include<stdio.h>//gccubuntu32位机#pragmapack(8)typedefstructm{chara;longb;}M;typedefstructn{chara;charb;longc;}N;typedefstructx{chara;structmb;longlongc;}X;typedefstructy{chara;structnb;longlongc;}Y;#pragmapack()#defineADDR(addr)((unsignedint)(addr))voidmain(void){printf("sizeof(char):%dsizeof(short):%dsizeof(int):%dsizeof(long):%dsizeof(longlong):%d\n",\sizeof(char),sizeof(short),sizeof(int),sizeof(long),sizeof(longlong));printf("sizeof(M):%dsizeof(N):%dsizeof(X):%dsizeof(Y):%d\n",sizeof(M),sizeof(N),sizeof(X),sizeof(Y));Mm;Nn;Xx;Yy;printf("m.a:%dm.b:%d\n",ADDR(&m.a)-ADDR(&m),ADDR(&m.b)-ADDR(&m));printf("n.a:%dn.b:%dn.c:%d\n",ADDR(&n.a)-ADDR(&n),ADDR(&n.b)-ADDR(&n),ADDR(&n.c)-ADDR(&n));printf("x.a:%dx.b.a:%dx.b.b:%dx.c:%d\n",ADDR(&x.a)-ADDR(&x),ADDR(&x.b.a)-ADDR(&x),ADDR(&x.b.b)-ADDR(&x),ADDR(&x.c)-ADDR(&x));printf("y.a:%dy.b.a:%dy.b.b:%dy.b.c:%dy.c:%d\n",ADDR(&y.a)-ADDR(&y),ADDR(&y.b.a)-ADDR(&y),ADDR(&y.b.b)-ADDR(&y),ADDR(&y.b.c)-ADDR(&y),ADDR(&y.c)-ADDR(&y));return;}/*程序运行结果:sizeof(char):1sizeof(short):2sizeof(int):4sizeof(long):4sizeof(longlong):8sizeof(M):8sizeof(N):8sizeof(X):20sizeof(Y):20m.a:0m.b:4n.a:0n.b:1n.c:4x.a:0x.b.a:4x.b.b:8x.c:12//这里的x.c没有对其到可被8整除的地址上//系统是按4字节对其的吗?32位的系统8字节对齐没有意义?//32位的系统,8字节的数据采用8字节的对齐方式,内存的读取//也要读取多次,对其到8字节浪费空间,且不能加快读取速度//因为32为的系统,数据总线是32位,一次最多也就只能取4个//字节的数据,8字节的数据,对齐到4字节和对齐到8字节是一样的//内存的硬件电路决定了,最大也就4字节对齐,大于4字节的对齐是没有意义的y.a:0y.b.a:4y.b.b:5y.b.c:8y.c:12//这里的y.c没有对其到可被8整除的地址上*//*把#pragmapack(8)改为#pragmapack(1)程序运行结果:sizeof(char):1sizeof(short):2sizeof(int):4sizeof(long):4sizeof(longlong):8sizeof(M):5sizeof(N):6sizeof(X):14sizeof(Y):15m.a:0m.b:1n.a:0n.b:1n.c:2x.a:0x.b.a:1x.b.b:2x.c:6y.a:0y.b.a:1y.b.b:2y.b.c:3y.c:7*//*把#pragmapack(8)改为#pragmapack(4)程序运行结果:sizeof(char):1sizeof(short):2sizeof(int):4sizeof(long):4sizeof(longlong):8sizeof(M):8sizeof(N):8sizeof(X):20sizeof(Y):20m.a:0m.b:4n.a:0n.b:1n.c:4x.a:0x.b.a:4x.b.b:8x.c:12y.a:0y.b.a:4y.b.b:5y.b.c:8y.c:12*/