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

似乎每一家企业在招聘的时候都很关注这个问题,无论在笔试还是面试都会提及。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;

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值