新乡专业做网站,凡科网站怎样做,网站备案与域名备案,网站开发后端指什么一个很重要的参数#pragma pack(n)数据边界对齐方式:以如下结构为例: struct {char a;WORD b;DWORD c;char d;}在Windows默认结构大小: sizeof(struct) 444416;与
#pragma pack(4)一样若设为
#pragma pack(1), 则结构大小: sizeof(struct) 12418;若设为
#pragma pack(2), 则… 一个很重要的参数#pragma pack(n)数据边界对齐方式:以如下结构为例: struct {char a;WORD b;DWORD c;char d;}在Windows默认结构大小: sizeof(struct) 444416;与
#pragma pack(4)一样若设为
#pragma pack(1), 则结构大小: sizeof(struct) 12418;若设为
#pragma pack(2), 则结构大小: sizeof(struct) 224210;在#pragma pack(1)时:空间是节省了,但访问速度降低了;结构体对齐的具体含义#pragma pack朋友帖了如下一段代码#pragma pack(4)class TestB{public:int aa;char a;short b;char c;};int nSize sizeof(TestB);这里nSize结果为12在预料之中。现在去掉第一个成员变量为如下代码#pragma pack(4)class TestC{public:char a;short b;char c;};int nSize sizeof(TestC);按照正常的填充方式nSize的结果应该是8为什么结果显示nSize为6呢事实上很多人对#pragma pack的理解是错误的。#pragma pack规定的对齐长度实际使用的规则是结构联合或者类的数据成员第一个放在偏移为0的地方以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中比较小的那个进行。也就是说
当#pragma pack的值等于或超过所有数据成员长度的时候这个值的大小将不产生任何效果。而结构整体的对齐则按照结构体中最大的数据成员 和 #pragma pack指定值 之间较小的那个进行。具体解释#pragma pack(4)class TestB{public:int aa; //第一个成员放在[0,3]偏移的位置char a; //第二个成员自身长为1#pragma pack(4),取小值也就是1所以这个成员按一字节对齐放在偏移[4]的位置。short b; //第三个成员自身长2#pragma pack(4)取2按2字节对齐所以放在偏移[6,7]的位置。char c; //第四个自身长为1放在[8]的位置。};这个类实际占据的内存空间是9字节类之间的对齐是按照类内部最大的成员的长度和#pragma pack规定的值之中较小的一个对齐的。所以这个例子中类之间对齐的长度是min(sizeof(int),4)也就是4。9按照4字节圆整的结果是12所以sizeof(TestB)是12。如果#pragma pack(2)class TestB{public:int aa; //第一个成员放在[0,3]偏移的位置char a; //第二个成员自身长为1#pragma pack(4),取小值也就是1所以这个成员按一字节对齐放在偏移[4]的位置。short b; //第三个成员自身长2#pragma pack(4)取2按2字节对齐所以放在偏移[6,7]的位置。char c; //第四个自身长为1放在[8]的位置。};//可以看出上面的位置完全没有变化只是类之间改为按2字节对齐9按2圆整的结果是10。//所以 sizeof(TestB)是10。最后看原贴现在去掉第一个成员变量为如下代码#pragma pack(4)class TestC{public:char a;//第一个成员放在[0]偏移的位置short b;//第二个成员自身长2#pragma pack(4)取2按2字节对齐所以放在偏移[2,3]的位置。char c;//第三个自身长为1放在[4]的位置。};//整个类的大小是5字节按照min(sizeof(short),4)字节对齐也就是2字节对齐结果是8//所以sizeof(TestC)是8。