#pragma pack(4)//设定为4字节对齐 struct test { char m1; double m4; int m3; }; #pragma pack(pop)//恢复对齐状态 以上结构体的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1大小为1个字节。接着开始为m4分配空间,这时其偏移量为4,需要补足...
char a; //第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。 short b; //第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[6,7]的位置。 char c; //第四个,自身长为1,放在[8]的位置。 }; 可见,此类实际占用的内存空...
共:4+4+4+4 = 16; === #pragma pack(8)时: One的大小: 口口口口 口口口口 d 口 口口口 口口口口 c占1位,i紧挨着占4位,再补3位对齐 共:8+8 = 16; Two的大小: 口口口口口口口口 c(补7位对齐) 口口口口 口口口口 d 口 口口口口口口口 i (补4位对齐) 共:8+8+8 = 24; ...
#pragmapack(1)//按照1字节方式进行对齐structTCPHEADER {shortSrcPort;//16位源端口号shortDstPort;//16位目的端口号intSerialNo;//32位序列号intAckNo;//32位确认号unsignedcharHaderLen :4;//4位首部长度unsignedcharReserved1 :4;//保留6位中的4位unsignedcharReserved2 :2;//保留6位中的2位unsignedcha...
#pragma pack(4) class TestB { public: int aa; //第一个成员,放在[0,3]偏移的位置, char a; //第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。 short b; //第三个成员,自身长2,#pragma ...
该编译指示对定义无效。当你使用#pragma pack ( n ) 时, 这里n 为1 、2 、4 、8 或1 6 。第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n 字节界限内。如果你使用无参量的#pragma pack , 结构成员被紧凑为以/ Z p 指定的值。该缺省/ Z p 紧凑值为/ Z p 8 。
// char c; //最后一步是进行圆整,圆整是根据 pack值与该结构里最大的成员的自身长度来比较,取最小的进行圆整;在这里成员是int占最多,因此取4,与pack比较,所以取4圆整,即10,11也要算上,所以总共12个字节。 }; int main() { cout<<sizeof(TestB)<<endl; ...
C++ 特性 pragma 与 MIDL 特性 pragma 的功能相同。示例C++ 复制 // cpp_attr_ref_pragma.cpp // compile with: /LD #include "unknwn.h" [module(name="MyLib")]; [pragma(pack(4))]; [dispinterface, uuid("00000000-0000-0000-0000-000000000001")] __interface A { [id(1)] HRESULT MyMethod...
如果定义了#pragma pack(n),则第二条规则里面,offset是该成员大小和n之间较小的数的整数倍。所以你定义#pragma pack(4)的话,对于short类型没有区别,仍然可以紧密排列,sizeof(a)=3*2=6。参考资料:http://blog.csdn.net/nellson/article/details/5293588 ...
1. 未指定#pragma pack时,系统默认的对齐模数4字节(32位机,X86系统等)。 2. 指定#pragma pack 对齐模数时,实际取pack 对齐模数和默认的最小值。 3. 结构体里面static变量,因为静态变量的存放位置与结构体实例的存储地址无关,是单独存放在静态数据区的,因此用siezof计算其大小时没有将静态成员所占的空间计算...