1.什么是内存对齐
内存对齐指的是编译器将每个“数据单元”安排在字的整数倍指向的内存中,即要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数。
2.为什么要使用内存对齐
原因:
- 某些硬件设备只能存取对齐数据,存取非对齐数据可能会发生异常;
- 某些硬件设备不能保证在存取非对齐数据的时候的操作是原子操作;
- 存取对齐的数据,要比存取非对齐的数据更快一些;
- 某些处理器虽然支持非对齐数据的访问,但会引发对齐陷阱;
- 某些硬件设备只支持简单数据指令非对齐存取,不支持复杂数据指令的非对齐存取
优点:
- 便于在不同平台之间移植,一些硬件平台不支持任意地址的访问
- 提高内存的访问效率,在CPU读取内存时,一块一块的读取
3.如何进行内存对齐
我们举个例子来介绍内存对齐的原理:
下面引用一张老图
- 我们都知道int类型的值在C++中占4字节,char类型占1字节,此例中我们存取整数倍数设置为4字节
- 首先存入c1,占1字节,填入
- 再对i存入,由于前面c1占用了1字节,整数倍内存为4字节,剩余空间只剩3字节,故i从5开始存取,占4字节
- 存入c2,由于i的结束位置为8,是4的整数倍,故c2从9开始进行存入,占一字节
由此可以看出此例中三个变量,共占内存为12字节
4.实例
代码:
#include <iostream>
using namespace std;
class a {
public:
char c1;//从1开始存入,占1字节
int i;//从5开始存入,占4字节
char c2;//从9开始存入,占1字节
};
class b {
public:
char c3;//从1开始存入,占1字节
char c4;//从2开始存入,占1字节
int j;//从5开始存入,占4字节
};
int main() {
a res1;
b res2;
cout << "类a占用内存:" << sizeof(res1) << "字节" << endl;
cout << "类b占用内存:" << sizeof(res2) << "字节" << endl;
}
输出: