内存对齐

这个问题以前纠结了好长时间,最近才明白了,以一个我回复的帖子作为例子描述出来。

struct st 
{
int a;
char c;
double b;
char d;
int e;
};
struct st2 
{
st b;
char a;
};
cout << sizeof(st2) << endl;


为什么结果为32呢?

 

解析:

1、结构体中变量开始地址是变量字节数整数倍
2、结构体以占用字节数最大的类型长度为基本长度
3、结构体占用总字节数是基本长度的整数倍

先计算st1
struct st
{
int a; //长度为4,开始地址为0,是长度整数倍,占用地址0,1,2,3
char c; //长度为1,开始地址为4 ,是长度整数倍,占用地址4
double b; //长度为8,开始地址为5 ,不是整数倍,补齐地址5,6,7,占用地址8.。。。。15

char d;//长度为1,开始地址为16,是长度整数倍,占用地址16

int e;//长度为4,开始地址为17,不是长度整数倍,补齐地址17,18,19,占用地址20,21,22,23

}总长度24,是基本长度8的整数倍

struct st2 
{
st b;//占用地址0到23,基本长度为8
char a;//长度为1,开始地址为24,是长度整数倍,占用地址24

};
总长度25,不是基本长度整数倍,补齐地址25到31,总长度为32

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值