结构体内存对齐规则
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
// 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
// VS中默认的对齐数为8 - 结构体总大小为:最大对齐数(所有变量类型最大者 与 默认对齐参数 取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
#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