内存字节对齐原则——总结
2015-04-08 20:37
417 查看
似乎每一家企业在招聘的时候都很关注这个问题,无论在笔试还是面试都会提及。ZZ最近找工作就经常遇到这样的问题,尽管之前有去了解过,但自己没有总结过,还是回答错了
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif)
这才想起来总结了,为时不晚吧。
字节对齐的原则主要有俩条:
在没有#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;
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif)
这才想起来总结了,为时不晚吧。
字节对齐的原则主要有俩条:
在没有#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;
相关文章推荐
- 内存字节对齐总结
- 结构体(struct)的使用、内存分布以及字节对齐测试总结
- 内存字节对齐总结
- 结构体(struct)的使用、内存分布以及字节对齐测试总结
- 字节字符和整数转换-大小端转换-结构体内存(文件)对齐规则之总结
- 内存字节对齐原则
- C语言:内存字节对齐详解
- C语言的内存的字节对齐的理解及其运用
- 内存字节对齐
- 关于struct和union存储的内存字节对齐的问题
- C语言结构体的字节对齐原则
- 关于字节对齐的总结
- 内存中字节对齐
- 字节对齐详解(整理总结)
- 内存字节对齐详解
- 5分钟搞定内存字节对齐-转
- c++ 内存 字节对齐
- 内存字节对齐
- 内存字节对齐,bitset对象
- C语言:内存字节对齐详解[转载]