面试题答案
一键面试原理
现代计算机内存以字节为单位进行编址,但是在访问数据时,不同类型的数据会有不同的对齐要求。例如,int
类型可能要求4字节对齐(在32位系统上),double
类型可能要求8字节对齐。如果结构体成员按照不合理的顺序排列,可能会导致内存空洞,浪费空间并且可能影响访问效率。为了优化内存布局,应按照数据类型的大小从大到小排列结构体成员,这样可以减少内存空洞,提高内存利用率和访问效率。
优化前结构体定义示例
struct Unoptimized {
char c; // 1字节
double d; // 8字节
int i; // 4字节
};
在上述结构体中,char
之后为double
,char
占用1字节,为了满足double
的8字节对齐要求,会在char
后填充7字节空洞,double
之后为int
,为了满足int
的4字节对齐要求,double
之后会填充4字节空洞,总共浪费了11字节空间。
优化后结构体定义示例
struct Optimized {
double d; // 8字节
int i; // 4字节
char c; // 1字节
};
在这个优化后的结构体中,double
先放置,然后是int
,最后是char
。int
紧跟double
,无需额外填充,char
紧跟int
,int
之后只需要填充3字节空洞,总共浪费3字节空间,相比优化前大大提高了内存利用率。