一 无#pragma pack
- 原则1:结构内部各个成员的首地址必然是自身大小的整数倍。
- 原则2:sizeof的最终结果必然是结构内部最大成员的整数倍,不够补齐。
二 有#pragma pack(n)
- 原则3:结构内部各个成员的首地址必然是min[n,自身大小]的整数倍。(以指定字节n与当前处理字节sizeof值比较)
- 原则4:整个sizeof的最终结果必然是min[n,结构内部最大成员],不够补齐。
三 举个栗子
情况1举例:—无#pragma pack 我这里主机64bit,指针占8个字节
typedef struct a
{
int *ptr;
char str[5];
int i;
}A;
此时sizeof(A) = 【8+(5+3)+4】+4 = 24
即sizeof(ptr) = 8,sizeof(str) = 5,于是由于原则1,补3个字节到str变量后,即5+3,sizeof(i) = 4。
此时整个机构体大小为8+5+3+4=20。但是还有原则2,最后再补4个字节,于是整个结构体为24字节。
情况2举例:—有#pragma pack(n)
#pragma pack(4)
typedef struct a
{
int *ptr;
char str[5];
int i;
}A;
此处按照4字节进行补齐操作;
此时sizeof(A) = 【8+(5+3)+4】 = 20
5+3为原则3补充字节;【8+(5+3)+4】=20,根据原则4,此处不补充字节