MST
星途 面试题库

面试题:C语言结构体嵌套中的内存对齐与优化

考虑以下结构体嵌套定义: ```c struct SubStruct1 { char c1; int i1; char c2; }; struct SubStruct2 { short s1; struct SubStruct1 sub1; long l1; }; ``` 1. 分析上述结构体嵌套中各个结构体的内存对齐方式,并计算`struct SubStruct2`的大小。 2. 如果希望优化内存布局,使得`struct SubStruct2`占用更少的内存,应该如何调整结构体成员的顺序?请给出优化后的结构体定义,并重新计算其大小。
43.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 内存对齐分析与struct SubStruct2大小计算
    • struct SubStruct1
      • char c1:占1字节。
      • int i1:通常int占4字节,由于对齐要求(假设以4字节对齐,一般系统int的对齐模数为4),c1后面需填充3字节,i1从4字节边界开始存储,占4字节。
      • char c2:占1字节。
      • struct SubStruct1大小为:1 + 3 + 4 + 1 = 8字节(总大小需是最大成员对齐模数的整数倍,这里最大成员int对齐模数为4,8是4的整数倍)。
    • struct SubStruct2
      • short s1:占2字节。
      • struct SubStruct1 sub1:占8字节。
      • long l1:假设long占8字节(在64位系统常见),s1sub1的总大小为2 + 8 = 10字节,需填充6字节,l1从16字节边界开始存储,占8字节。
      • struct SubStruct2大小为:2 + 8 + 6 + 8 = 24字节(总大小需是最大成员对齐模数的整数倍,这里最大成员long对齐模数为8,24是8的整数倍)。
  2. 优化内存布局
    • 优化思路:将成员按照其大小从小到大排列,尽量减少填充字节。
    • 优化后的结构体定义
struct SubStruct1 {
    char c1;
    char c2;
    int i1;
};

struct SubStruct2 {
    short s1;
    long l1;
    struct SubStruct1 sub1;
};
  • 重新计算大小
    • struct SubStruct1
      • char c1:占1字节。
      • char c2:占1字节,无需填充。
      • int i1:占4字节,c1c2共2字节,需填充2字节,i1从4字节边界开始存储,占4字节。
      • struct SubStruct1大小为:1 + 1 + 2 + 4 = 8字节(总大小需是最大成员对齐模数的整数倍,这里最大成员int对齐模数为4,8是4的整数倍)。
    • struct SubStruct2
      • short s1:占2字节。
      • long l1:占8字节,s1需填充6字节,l1从8字节边界开始存储,占8字节。
      • struct SubStruct1 sub1:占8字节,无需填充。
      • struct SubStruct2大小为:2 + 6 + 8 + 8 = 24字节(总大小需是最大成员对齐模数的整数倍,这里最大成员long对齐模数为8,24是8的整数倍)。 在这种情况下,虽然成员顺序调整,但由于long的对齐要求,整体大小未变。若系统中long占4字节:
  • 优化后的结构体定义
struct SubStruct1 {
    char c1;
    char c2;
    int i1;
};

struct SubStruct2 {
    short s1;
    struct SubStruct1 sub1;
    long l1;
};
  • 重新计算大小
    • struct SubStruct1:同上述分析,大小为8字节。
    • struct SubStruct2
      • short s1:占2字节。
      • struct SubStruct1 sub1:占8字节。
      • long l1:占4字节,s1sub1总大小为2 + 8 = 10字节,需填充2字节,l1从12字节边界开始存储,占4字节。
      • struct SubStruct2大小为:2 + 8 + 2 + 4 = 16字节(总大小需是最大成员对齐模数的整数倍,这里最大成员intlong对齐模数为4,16是4的整数倍)。