MST

星途 面试题库

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

定义一个结构体A,包含一个char类型成员、一个int类型成员、一个结构体B。结构体B包含两个short类型成员。请分析这个结构体A的内存布局,并解释内存对齐原则是如何影响其内存占用的,同时编写代码验证你的分析。
46.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

内存布局分析

  1. 结构体B的内存布局
    • 结构体B包含两个short类型成员。short类型通常在32位和64位系统上都是2字节。由于结构体B没有更复杂的嵌套,其内存占用为2 + 2 = 4字节,因为short类型本身占用2字节,且没有跨越自然对齐边界的情况。
  2. 结构体A的内存布局
    • 结构体A包含一个char类型成员(1字节),一个int类型成员(通常在32位和64位系统上是4字节),以及一个结构体B(4字节)。
    • 内存对齐原则规定,结构体的成员变量要按照其自身大小的整数倍进行对齐。char类型成员占用1字节,但为了满足后续int类型成员的4字节对齐,它后面会填充3字节,使得char及其填充字节共占4字节。
    • int类型成员自然对齐在4字节边界,占用4字节。
    • 结构体B本身占用4字节,且它也自然对齐在4字节边界(因为它的大小是4字节)。
    • 所以结构体A总的内存占用为4(char及填充) + 4(int) + 4(结构体B) = 12字节。

内存对齐原则影响分析

内存对齐原则是为了提高CPU访问内存的效率。CPU在访问内存时,通常以特定大小(如4字节、8字节等)的块进行读取。如果结构体成员按照其自身大小的整数倍对齐,CPU可以一次读取一个完整的成员,而不需要进行额外的操作来处理跨越多个内存块的成员。例如,如果int类型成员没有对齐到4字节边界,CPU可能需要进行两次读取,并对结果进行合并,这会降低访问效率。

代码验证

#include <stdio.h>
#include <stdint.h>

// 定义结构体B
typedef struct {
    short s1;
    short s2;
} B;

// 定义结构体A
typedef struct {
    char c;
    int i;
    B b;
} A;

int main() {
    printf("Size of struct B: %zu bytes\n", sizeof(B));
    printf("Size of struct A: %zu bytes\n", sizeof(A));
    return 0;
}

在上述代码中,sizeof(B)输出为4,sizeof(A)输出为12,验证了我们之前的分析。在不同的编译器和系统环境下,结果可能会因为内存对齐的具体实现而略有不同,但基本的对齐原则是一致的。