今天面试遇到内存对齐的问题,之前也遇到过没做总结,今天很侥幸地过了,在此做一个简单的总结:
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个字节(3