今天面试遇到内存对齐的问题,之前也遇到过没做总结,今天很侥幸地过了,在此做一个简单的总结:
1.关于什么是内存对齐以及为什么要内存对齐,网上一大堆,我就不抄了,我写几个实例分析一下:
2.在linux 平台下,以C语言的结构体为例:
1)struct member
{
char num;
short grade;
int total;
};
通过上述结构体定义一个变量,该变量在内存中的大小为8个字节(32位机器)
gcc编译器默认的是4字节对齐,在第一个结构体中,成员类型是char short int,char在内存中占1个字节,short占2个字节,int占4个字节,故对于第一个结构体变量的大小很多人都以为是7个字节,没有考虑内存对齐的问题。
结构体的起始地址是第一个成员的起始地址,char变量可以放在任意的位置,因为它在内存中只占一个字节,short变量占两个字节,故它的起始地址应该是2的倍数,故我们需要在第一个char后面留一个字节的空,让short变量的内存能与之前的内存保持对齐,最后一个int成员,int占4个字节,而前面的char 和short 成员刚好占了4个字节,与最后一个成员的内存能够保持对齐。
2)struct member
{
short grade;
int total;
char num;
};
通过上述结构体定义一个变量,该变量在内存中的大小为12个字节(32位机器)
在这个结构体中,结构体起始大小是2个字节,需要与后面的int 保持一致,故需要留出两个空格,最后一个是char 变量,本身只占一个字节,但是gcc默认是4个字节对齐,故需要留出三个空格,保证内存对齐。
3)struct member
{
int total;
char num;
short grade;
};
通过上述结构体定义一个变量,该变量在内存中的大小为8个字节(32位机器)
在上述结构体中,第一个成员是int 占4个字节本身就是对齐的,第二个成员char 需要与后面的short保持对齐故需要添加一个空格,第三个成员short占两个字节与之前的两个字节共占了4个字节,保证了内存对齐,不需要进行额外处理。