c++ 内存对齐问题

内存对齐的含义:
1.在处理结构体内的成员时,每个成员在内存中的起始地址必须是成员类型所占字节数的整数倍。
2.另外,还有一条重要规则,sizeof计算结果必须是结构体中占用内存最大变量的内存的整数倍。
3.最后,注意在数据内存对齐,要以结构体中最深层的基本数据类型为准。
关于sizeof计算结构体占用的内存问题,看三个例子:
目的是为了方便加快数据的读取速度,减少指令周期等。

struct s1{
	char a;
	short b;
	int c;
	double d;
};
//sizeof(s1) :16

分析:
开始,char a占1个字节,起始地址为0;后面short b占2字节,起始地址必须为2的整数倍,故地址为1的内存空出来,b 从地址为2处开始放,占用2字节;接着int c 占4个字节,此时放完b后,后面一位的地址为4,正好为int整数倍,故放c,占4字节。最后放完c后,后面一位地址是8,正好放double b,占8个字节。故s1内存占16字节。且16为8的整数倍。

struct s1{
	char a;
	short b;
	double c;
	int d;
};
//sizeof(s2) :24

分析,开始,char a占1个字节,起始地址为0;后面short b占2字节,起始地址必须为2的整数倍,故地址为1的内存空出来,b 从地址为2处开始放,占用2字节;放完b后,后一位地址为4,而double c内存为8,故地址5,6,7空出来,c从地址8开始放,占8个字节;放完c后,后一位地址为16,正好放 int d,占4字节,故s2本应为19字节。但考虑到上述规则,s2的大小为8的整数倍,故空出20,21,22,23.
实际为24字节。

struct s1{
	int i;
};
struct s2{
	char a[4];
};
struct s3{
	s1 a;
	char b;
};
struct s4{
	s2 a;
	char b;
};
//sizeof(s3) ==8;
//sizeof(s4) ==5;

分析:
s3中,a占4个字节,b占1字节,s3本应为5字节,考虑s3字节是最大数据类型整数倍,故为8;
s4中,a占4字节,b占1字节,s4本应为5字节,考虑s4字节是最大数据类型整数倍,根据规则3,s4的基本数据类型仍为char,故s4字节为5.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值