一. 意义
1. 优势
不是所有的硬件平台都能够访问任意的地址,CPU是按照块来访问内存的(可能是2、4、8、16字节块),如果不进行内存对齐来储存数据,那么数据是一个字节挨着一个字节来存的,这样的话会增加的CPU访问负担,例如:
假设现在CPU是按照每4个字节来访问内存,有地址0、和地址1,现在要存1个char变量(假设char变量占1字节)和1个int变量(假设int变量占4字节),那么可以有内存对齐和内存不对齐的存储方式,如下图:
假如不采用内存对齐的方式存储数据,那么CPU需要访问地址0和地址1,再进行合并,才能得到最终的结果;
采用内存对齐的方式进行存储数据的话,则只需访问地址1就可以得到最终的结果。
因此,采用内存对齐的存储方式可以减少CPU的访问运行时间。
2. 缺点
可以明显知道内存对齐方式存储数据没有充分利用存储空间,但是对于工程实践来说,我们更愿意用这样的“空间换时间”的方式,这样可以大大较少我们的访问实践。
二. 对齐规则
数据是根据初始化的顺序存储的,先定义的先储存,存储地址需要是sizeof(数据变量)的整数倍。
例如,假设sizeof(char) = 1,sizeof(int) = 4,sizeof(int) = 4,sizeof(double) = 8。结构的对齐规则是要先确定对齐字节数(对齐字节数=结构体中的变量占用空间最大的那个字节数,下面的结构体t3、t4就是sizeof(double) = 8),然后再保证存储地址是sizeof(数据变量)的整数倍。
#include <iostream>
using namespace std;
struct t1{
char a;
short c;
int x;
char b;
};
struct t2{
int x;
char b;
char c;
short a;
};
struct t3{
short a;
double c;
int x;
char b;
};
struct t4{
char a, b;
int x;
double c;
};
int main()
{
cout << sizeof(t1) << endl; //12
cout << sizeof(t2) << endl; //8
cout << sizeof(t3) << endl; //24
cout << sizeof(t4) << endl; //16
return 0;
}