似乎每一家企业在招聘的时候都很关注这个问题,无论在笔试还是面试都会提及。ZZ最近找工作就经常遇到这样的问题,尽管之前有去了解过,但自己没有总结过,还是回答错了这才想起来总结了,为时不晚吧。
字节对齐的原则主要有俩条:
在没有#pragma pack的情况下
1、sizeof的最终结果必然是结构内部最大成员的整数倍,不够补齐。
结构内部最大成员包含子成员结构体内部的成员,可以这么理解:
typedef struct a
{
double e;
int g;
short l;
}a;
typedef struct b
{
char c;
struct a e;
}b;
等价于
typedef struct b
{
char c;
double e;
int g;
short l;
}b;
2、结构内部各个成员的首地址必然是自身大小的整数倍。
如果定义了#pragma pack(n),则上述俩条规则可定义为:
1、整个sizeof的最终结果必然是 min[n,结构内部最大成员] 的整数倍,不够补齐。
2、结构内部各个成员的首地址必然是min[n,自身大小]的整数倍。
由上述原则可知,在写结构体时,成员先后不要随意写哦,应遵循从大到小的原则,这样有助于节省空间。
举例如下:
struct A
{
short d;//0~1
double e;//8~15 规则2(应该知道我指的是哪条规则吧)
int c;//16~20 符合规则2
}=====24 规则1
struct A
{
double e;//0~7
int c;//8~11 符合规则2
short d;//12~13 符合规则2
}=====16 规则1
#pragma pack(2)
typedef struct a
{
char c;//0
int g;//2~5 规则2
double e;//6~13 符合规则2
}a;======14 符合规则1
#pragma pack(4)
typedef struct a
{
char c;//0
int g;//4~7 规则2
double e;//8~15 符合规则2
}a;======16 符合规则1
#pragma pack(4)
typedef struct a
{
char c;//0
int g;//4~7 规则2
double e;//8~15 符合规则2
char d;//16
}a;======20 规则1
大家可以思考一下下面的sizeof会是多少?
#pragma pack(2)
typedef struct a
{
char c;
int g;
double e;
char d;
}a;