MST
星途 面试题库

面试题:C语言结构体成员访问效率优化之内存布局

假设你有一个结构体包含不同类型的成员,如char、int、double等。如何通过调整结构体成员的顺序来优化内存布局,进而提高成员访问效率?请详细阐述原理,并给出一个优化前后的结构体定义示例。
50.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

原理

现代计算机内存以字节为单位进行编址,但是在访问数据时,不同类型的数据会有不同的对齐要求。例如,int类型可能要求4字节对齐(在32位系统上),double类型可能要求8字节对齐。如果结构体成员按照不合理的顺序排列,可能会导致内存空洞,浪费空间并且可能影响访问效率。为了优化内存布局,应按照数据类型的大小从大到小排列结构体成员,这样可以减少内存空洞,提高内存利用率和访问效率。

优化前结构体定义示例

struct Unoptimized {
    char c; // 1字节
    double d; // 8字节
    int i; // 4字节
};

在上述结构体中,char之后为doublechar占用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,最后是charint紧跟double,无需额外填充,char紧跟intint之后只需要填充3字节空洞,总共浪费3字节空间,相比优化前大大提高了内存利用率。