C++基础知识13:结构体内存管理
C++基础知识13:结构体内存管理
- 一、本文内容与前置知识点
- 1. 本文内容
- 2. 前置知识点
- 二、内存对齐规则
- 1. 自然对齐
- 2. 复合结构体的内存对齐规则
- 三、为什么要内存对齐
一、本文内容与前置知识点
1. 本文内容
结构体内存管理,其中内存对齐,padding和结构体内存大小的padding,以及为什么要内存对齐。
2. 前置知识点
- c++关于结构体的知识点
二、内存对齐规则
1. 自然对齐
- 规则1:一个变量的内存起始地址正好等于其长度的整数倍,不足要补齐。
- 规则2:结构体这样的复合结构的总大小,必须是其内部最大成员的整数倍,不足的要补齐。
复合结构总大小时最大成员整数倍可以保证结构体数据也是对齐的。
struct Example {char a; // 1字节int b; // 4字节short c; // 2字节
};
//计算方式
//规则1:1+3(padding)+4+2 = 10
//规则2:10+2 = 12
2. 复合结构体的内存对齐规则
- 每个结构体有两个属性
- 自身内存大小。
- 最大基本数据类型。
- 结构体在复合结构体中的的起始位置只要是最大基本数据类型的整数倍即可,就已经可以完成基本数据的内存对齐了。
- 复合结构体的总大小时最大基本数据类型的整数倍即可。
struct Inner {short a; // 2字节double b; // 8字节
};
//总内存16,最大基本类型8
struct Outer {char c; // 1字节struct Inner d; // 内嵌结构体int e; // 4字节
};
//规则1:1 + 7(padding) + 16 + 4 = 28
//规则2:28 + 4(padding) = 32
三、为什么要内存对齐
现代计算机的处理器通常以字节、字、双字等块为单位访问内存。如果数据未对齐,处理器可能需要多次内存访问才能获取一个完整的数据。例如,当一个4字节的数据(如int)存储在一个非4字节对齐的地址上,处理器可能需要进行两次内存读取来获取完整的数据,而如果数据是对齐的,处理器只需一次访问即可。因此,内存对齐可以避免不必要的内存访问,从而提高访问效率。