什么是内存对齐?
为了方便解释这个问题,我们先来看下面这个代码示例:
#include <stdio.h>
//定义结构体A
struct A
{
short a;
char b;
int c;
};
//定义结构体B
struct B
{
short a;
int b;
char c;
};
//输出每个结构体所占的内存字节大小
printf("%d\n",sizeof(A));
printf("%d\n",sizeof(B));
return 0;
运行结果为:
8
12
分别对他们求大小,sizeof(A),sizeof(B)我们所得到的结果是不同的,
sizeof(A)=12而sizeof(B)=8为什么会产生不一样的结果呢?
这是非常简单的一个例子,体现了结构体的内存对齐规则。
在结构体中,从结构体的首地址开始,假设地址从0开始。
对结构体A来说,a占1个字节,占从01的字节,b是char类型占1个字节,占从45的字节,c占4个字节,从4~7的字节。
对结构体B来说,a占1字节,从01,b占4个字节从48;c占1个字节从8~9。
这就是内存对齐,对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍(所以这里的A的大小是8,而不是 6)。
————————————————
为什么要内存对齐?
1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;
某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异
常。
2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问
仅需要一次访问。
————————————————