您的位置:首页 > 其它

内存字节对齐原则——总结

2015-04-08 20:37 417 查看
似乎每一家企业在招聘的时候都很关注这个问题,无论在笔试还是面试都会提及。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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: