为什么要内存对齐
内存中存放数据的时候要有一定的规则,这么做得根本原因是要减少CPU访问内存的次数。举个例子,int类型为4个字节,存放int类型的内存的起始地址就是4的倍数,这样CPU访问一次内存就能够取到数据(跟CPU访问内存的机制有关,加上Cache的映射,一般CPU一次访问64字节的数据,也有128字节的)。假设CPU一次访问64字节,那么只有这个int数据起始地址是4的倍数,那么CPU总能一次把它读取成功。假设是2字节对齐,这个数据就有可能存储在第一块的63、64字节和第一块的1、2字节,这样CPU要访问两次内存才能获取一个int类型的数据。这就是内存对齐的意义。
如何对齐
内存对齐的一般规则是数据类型是几个字节起始地址就是几的倍数(不考虑自己pack的情况),typedef的数据类型按照组成它的基本数据类型来算。几个例子:
- char :一个字节不用对齐;
- short : 两个字节,2 的倍数
- int :4 字节, 4的倍数
- double :8字节, 8的倍数
结构体对齐
-
typedef struct sta
{
char a;
char b;
double c;
}STA_S;
sizeof(STA_S) = 16 (b后有6个字节的空洞) -
typedef struct stb
{
char a;
short b;
int c;
}STB_S;
sizeof(STB_S) = 8 [ a(1) + padding(1) + b(2) + c(4) ] -
typedef struct stc
{
short a;
char b;
int e;
}STC_S;typedef struct std
{
char a;
short b;
STC_S c;
}STD_S;
sizeof(STD_S) = 12 [ d.a(1) + padding(1) + d.b(2) + d.c.a(2) + d.c.b(1) + padding(1) + d.c.e(4) ]