首先讲一个概念—-内存对齐
一种提高内存访问速度的策略,cpu在访问未对其的内存需要经过两次内存访问,而经过内存对齐一次就可以了。(?)
打个比方就是:操作系统在访问内存时,每次读取一定的长度(这个长度是系统默认的对其系数),程序中你也可以自己设定对齐系数,告诉编译器你想怎么对齐,可用#pargam pack(n),指定n为对其系数。但是当没有了内存对齐,cpu在访问一个变量时候,可能会访问两次,为什么呢?
32位cpu一次能最多处理的信息是32bit位,如果你没有指定对齐,我们假设这样的数据结构在内存中存在的情况,这也是我们后面要讨论的结构
typedef strutc test{
char a;
int b;
char c;
}
对应的在内存中存放的方式可能是这样(假定32位下):
那么,这样一来,取得这个int型变量需要经过两次的寻址,拼凑成一个完整的4字节的数。这个过程还涉及到cpu指令集调用和总线的读写操作,如果真是没有对齐的话,效率会差到不知道哪儿去了。
所以这个内存对齐是必须遵守的,为了提高cpu访问效率和速度。
继续引入另外一个概念:内存的自然对齐:每一种数据类型都必须放在地址中的整数倍上
举个例子如下:
地址4可以放char(1)类型,可以放int(4)型,可以放short(2)型,但是不能存放double(8)型,仅仅因为4不是8的整数倍。
地址3能存放char型,但是其他int,short,double都不能存放。
有一个特殊地址,就是0,它可以是任何类型的整数倍,所以可以存放任何数据。
根据这个规则,那么在分配一大块包含很多变量的内存的时候,会产生很多