结构体(类)内存对齐规则详解

结构体内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    // 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    // VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者 与 默认对齐参数 取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
#include<iostream>
using namespace std;
//内存对其
class A {
	int a;//4
	char b;//1
};

class B {
	char x;//1
	int y;//4
};
int main()
{
	cout << sizeof(A) << endl;//8
	
	//由于 int 类型的对齐要求是 4 字节,而类的总大小也通常需要是最大对齐要求的整数倍(在这个例子中是 4 字节),
	//因此编译器在 char b 后面插入了 3 个字节的填充,使得整个类的大小为 8 字节。

	//A内存类似:4,1,3

	cout << sizeof(B) << endl;//8
	//int y 按照 4 字节对齐要求存储,因此在 char x 之后,编译器插入了 3 个字节的填充。
	//因此,int y 从一个对齐的 4 字节地址开始,占用 4 字节
	
	//B内存类似:1,3,4
}


在这里插入图片描述
面试题:为什么要进行内存对其

答:内存对齐是计算机系统中一个重要的优化技术,它通过减少内存访问次数、简化硬件设计、提高数据处理速度等方式,提升了系统的整体性能。虽然内存对齐可能会导致少量的内存浪费,但这在性能提升面前通常是值得的权衡。

小练习:
有一个如下的结构体:

struct A{
 long a1;
 short a2;
 int a3;
 int *a4;
};

请问在64位编译器下用sizeof(struct A)计算出的大小是多少?( )

答案:
在这里插入图片描述

所以大小是24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

劲夫学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值