关于字节对齐
pragma pack
一、
测试代码:
// packTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; /************************************************************************/ /* Defualt */ /************************************************************************/ class A0 { char a; int b; double c; bool d; short e; }; class A1 { char a; int b; double c; bool d; }; class A2 { char a; int b; double c; }; class A3 { char a; int b; }; class A { char a; int b; double c; bool d; short e; char f; }; /* 事实上,很多人对#pragma pack的理解是错误的。 #pragma pack规定的对齐长度,实际使用的规则是: 结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐, 按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。 而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。 */ /************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(1) class B { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop) /************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(2) class BB { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop) /************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(4) class C { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop) /************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(8) class D { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop) int _tmain(int argc, _TCHAR* argv[]) { cout<<"char : "<<sizeof(char)<<" byte "; cout<<"int : "<<sizeof(int)<<" byte "; cout<<"double : "<<sizeof(double)<<" byte "; cout<<"bool : "<<sizeof(bool)<<" byte "; cout<<"short : "<<sizeof(short)<<" byte "; cout<<"/*---------------------------------------------*/"<<" "; cout<<"Default aligned A3:"<<sizeof(A3)<<" "; cout<<"Default aligned A2:"<<sizeof(A2)<<" "; cout<<"Default aligned A1:"<<sizeof(A1)<<" "; cout<<"Default aligned A0:"<<sizeof(A0)<<" "; cout<<"Default aligned A:"<<sizeof(A)<<" "; cout<<"1 aligned:"<<sizeof(B)<<" "; cout<<"2 aligned:"<<sizeof(BB)<<" "; cout<<"4 aligned:"<<sizeof(C)<<" "; cout<<"8 aligned:"<<sizeof(D)<<" "; return 0; }
二、测试结果
三 、各类说明分析
/************************************************************************/ /* Defualt */ /************************************************************************/ class A0 { /* * 默认为 8 字节对齐 */ char a; int b; double c; bool d; short e; }; class A1 { char a; int b; double c; bool d; }; class A2 { char a; int b; double c; }; class A3 { char a; int b; }; class A { char a; int b; double c; bool d; short e; char f; };
/************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(1) class B { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop)
/************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(2) class BB { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop)
/************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(4) class C { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop)
/************************************************************************/ /* */ /************************************************************************/ #pragma pack(push) #pragma pack(8) class D { char a; int b; double c; bool d; short e; char f; }; #pragma pack(pop)
参考:http://msdn.microsoft.com/zh-cn/library/2e70t5y1(v=vs.90).aspx
***************************************************************************
Specifies the value, in bytes, to be used for packing. The default
value for n is
8. Valid values are 1, 2, 4, 8, and 16. The alignment of a member will be on a boundary that is either a multiple of n or
a multiple of the size of the member, whichever is smaller.
源码下载地址:http://download.csdn.net/detail/cartzhang/6792147
----------------------------------
若有 问题,请不吝赐教。
非常感谢!