参考:https://docs.microsoft.com/en-us/cpp/preprocessor/pack?view=msvc-160
https://blog.csdn.net/aidem_brown/article/details/77540527
https://zhuanlan.zhihu.com/p/93822540
格式:
#pragma pack( show )
#pragma pack( push
[ ,
identifier
] [ ,
n
] )
#pragma pack( pop
[ ,
{ identifier
| n
} ] )
#pragma pack(
[ n
] )
对于n的说明:
(Optional) Specifies the value, in bytes, to be used for packing. If the compiler option /Zp isn‘t set for the module, the default value for n
is 8. Valid values are 1, 2, 4, 8, and 16. The alignment of a member is on a boundary that‘s either a multiple of n
, or a multiple of the size of the member, whichever is smaller.
如果没有设置,则默认的n为8,用户可以通过pack设置值为:1、2、4、8、16,成员的对齐的值是:n、成员变量中最长的,两个之间的较小值。
以下如没有特殊说明,均视为情况3(未明确指定)计算
例如,如下的两个结构体,虽然成员相同,但是由于顺序不同,导致两个结构体的大小不同
struct myStruct { char c; int val1; double val2; }; struct myStruct2 { char c; double val2; int val1; };
由于没有使用#pragma pack 命令,则默认的为8
对于myStruct:
成员c所为第一个数据成员,存放在offset为0的地方,val1为int,需要存放在4的倍数的位置,因此在第一个成员c后补充3个字节,对于成员val2,为double,需要放在8的倍数,在前两个成员放置后,刚好在8的倍数上,因此:总的大小为:4+4+8=16
对于myStruct2:
成员c所为第一个数据成员,存放在offset为0的地方;
第二个成员为double,需要放在8的倍数上,因此在第一个成员后补充7个byte;
第三个为val1,int类型,占用4个byte,
因此:总的大小为:8+8+4=20,但是总长度为20,不是8的倍数(规则3),因此还需要再填充4个byte,最终的长度为:24
对于class,情况更加复杂,还需要考虑到类中是否有虚函数,虚表指针等;
原文:https://www.cnblogs.com/zyk1113/p/14356984.html