C语言的内存对齐
什么是内存对齐?为什么要内存对齐?如何行内存对齐?
内存对齐是指:数据在内存里放的数据,不是紧密的放在一起,而是按照一定的规则存放。
为什么要内存对齐:在32的cpu上,每条指令可以读取32位(4个字节的值),内存对齐是为了保证一次指令可以读到一个完整的数据,减少数据的拼合耗费。如下举例:
struct A
{
char a;
int b;
}temp;
则temp在内存中的存储是第一种方式(只是为了举例说明,并非实际的内存):
|a | 空 | b |
--------------------
| | | | | | | | |
0 1 2 3 4 5 6 7 8
而不是第二种方式:
|a | b |
-------------------------
| | | | | | | | |
0 1 2 3 4 5 6 7 8
第一种方式:取b的时候,一个指令周期就可以取的到b。而第二种方式,第一个指令取0-3位,但却只取了b的一部分。再要有一个指令周期才能要b全取出来,并且还要进行一些运算。
如何进行内存对其:
按照数据的占有字节数,以保证一个指令周期能取到这个数为目标进行对齐。
如:
struct AA
{
char a;
int b;
char c;
}
struct BB
{
char a;
char c;
int b;
}
根据上面的原则:sizeof(AA) = 12,sizeof(BB) = 8;无声中节约了4个自己的内存。
win32的C编译器默认是4字节对齐的。当然也可以通过预编译指令来配置这个对齐的字节数。
再举个例子:
struct CC
{
char a;
short b;
char c;
int d;
}
sizeof(CC) = ? 是8还是12?
答案是12.
内存分配如下:
|a |空| b |c | 空 | d |
-------------------------------------
| | | | | | | | | | | | |
0 1 2 3 4 5 6 7 8 9 0 1 2
而不是
|a | b |c | d |
------------------------------------
| | | | | | | | | | | | |
0 1 2 3 4 5 6 7 8 9 0 1 2