结构体的内存对齐实际上是硬件工程师的事,但是由于笔试经常考,而且我们在实际项目中由于设置的对齐方式不对曾经导致过在不同机器上不能移植的问题。所以有必要了解一下。
1.为什么需要内存对齐:因为计算机一次处理数据的单元不是字节,而是块。(即1 2 4 8 16字节)
2.struct是怎样进行内存布局的;
总体来说就是,某一中类型要在其尺寸大小整数倍的地址上放置,最后一个变量要补充空位(为了方便快速的实现这种结构体的数组)。
常用字节数(32位机):
int 一个字 32位,4字节
short 半个字 16位,2字节
long 一个字 32位,4字节
char 1字节
float 一个字 32位 ,4字节
double 两个字 64位, 8字节
看如下几个结构体的内存布局:
1. typedef struct ms1
{
char a;
int b;
} MS1;
内存布局为:1+3+4=8
_______________________________________
| |\\\\\\\\\\\| |
| a |\\padding\\| b |
| |\\\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 3 4
2. typedef struct ms2
{ int a;
char b;
}MS2;
内存布局为:4+1+3=8;后面的3是填充字节。填充的长度是使得满足整体长度能够整除最大成员变量长度。即8/4。
3. typedef struct ms3
{
char a;
short b;
double c;
}ms3
内存布局为:1+1+2+4+8=16。short是2 所以1+1,得到的结果必须能被2整除。double是8,剩下的4个字节放不下,必须填充4个字节,这样1+1+2+4才是8的倍数,然后放入。
4. typedef struct ms4
{
char a;
ms3 b;
}
内存布局为: 1+7+16=24。b的最大成员变量是8,所以前面要填充7个字节。
如果要知道详细的情况,参考http://hi.baidu.com/phps/blog/item/f03eb93ee12f49fa838b1365.html