结构体内存对齐

关于结构体的内存对齐文体,主要遵循下面几个原则,记住就好。

1.结构体的第一个成员永远都放在结构体的0偏移处。

2.从第二个成员开始,都要对其到某个对齐数的整数倍处。

(对齐数:结构体成员自身大小和默认对齐数的较小值;

  默认对齐数:VS编译器下:8,linux:4)

3.结构体的总大小必须是最大对齐数的整数倍。

注意:0偏移处大家可能有所疑问,其实就是系统默认从哪个位置开始分配内存的地方就是0偏移处,因为它并没有偏移嘛。

             偏移:就是往后挪。

请大家看下面的详解:

struct student
{
	char a;
	int b;
	double c;
	char d;
};

                                                                                          

验证结果:


下面再来看几个具体的实际例子:

下面是我自己总结的简单计算方法(a+b)b表示自身大小,a表示偏移几个位置,0的话表示紧接着就分配空间了

struct student
{
	int a;//0+4
	char b;//0+1
	int c;//3+4
	double d;//4+8
};

4+1+3+4+4+8=24(刚好为最大对齐数8的倍数所以不用再继续分分配空间)

结果:24(如果对结果有疑问自己上机验证)

struct student
{
	double a;//0+8
	int b;//0+4
	char c;//0+1
	int d;//3+4
};

8+4+1+3+4=20

因为最大对齐数为8,而20不是8的倍数,所以自动分配空间到24,为8的倍数

结果:24(如果对结果有疑问自己上机验证)

如果有什么问题或者疑问可以私信我,或者直接留言评论,谢谢大家的宝贵意见!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值