摘要:数据对齐对内存的占用影响很大,良好的变量声明顺序有利于减少资源的占用和提高运行效率。 指令: #pragma pack( push, n ) //VC编译器默认( n = 8 )字节对齐 #pragma pack( pop ) 原则: 1.每个成员分别按自己的方式对齐,并能最小化长度 2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 4.对于数组,对齐方式为元素的对齐方式。 比如:char a[3];这种,它的对齐方式和分别写3个char是一样的,也就是说它还是按1个字节对齐。 例子: struct A { int a; //int占4字节,补充4字节 unsigned __int64 b; //__int64占8字节 short c; //short占2字节,补充6字节 }; sizeof(A) = 24; //8的倍数,sizeof(__int64) = 8; struct B { int a; //int占4字节 short b; //short占2字节,补2字节 unsigned __int64 c; //__int64占8字节,偏移从8开始 }; sizeof(B) = 16; //8的倍数,sizeof(__int64) = 8; struct C { char a; //char占1字节 char b; //char占1字节,补2字节,int b;要从4开始 int c; //int占4字节 double d; //double占8字节 }; sizeof(C) = 16; //8的倍数,sizeof(double) = 8; struct D { char a; //char占1字节,补3字节 int b; //int占4字节,偏移要从4开始 double c; //double占8字节 char d; //char占1字节,补7字节 }; sizeof(D) = 24; //8的倍数,sizeof(double) = 8; 指定对齐: #pragma pack(1) //强制1字节对齐 sizeof(A) = 14; // 4+8+2 sizeof(B) = 14; // 4+2+8 sizeof(C) = 14; // 1+1+4+8 sizeof(D) = 14; // 1+4+8+1 #pragma pack(2) //强制2字节对齐 sizeof(A) = 14; // 4+8+2 sizeof(B) = 14; // 4+2+8 sizeof(C) = 14; // 1+1+4+8 sizeof(D) = 16; // 1+(1)+4+8+1+(1) #pragma pack(4) //强制4字节对齐 sizeof(A) = 16; // 4+8+4 sizeof(B) = 16; // 4+4+8 sizeof(C) = 16; // 1+1+(2)+4+8 sizeof(D) = 20; // 1+(3)+4+8+1+(3) #pragma pack(8) //强制8字节对齐 sizeof(A) = 24; // 4+(4)+8+2+(6) sizeof(B) = 16; // 4+2+(2)+8 sizeof(C) = 16; // 1+1+(2)+4+8 sizeof(D) = 124; // 1+(3)+4+8+1+(7) 参见更详细讲解: http://hmily518.blog.hexun.com/11299708_d.html http://blog.chinaunix.net/u/14211/showart_115122.html http://blog.chinaunix.net/u/14211/showart_115122.html http://blog.csdn.net/candj/archive/2009/10/07/4638853.aspx