MST

星途 面试题库

面试题:C++ 结构体与联合体的内存布局差异

请详细阐述 C++ 结构体和联合体在内存布局上有什么不同,并举例说明如何计算它们各自占用的内存大小。
24.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

C++ 结构体和联合体内存布局不同点

  1. 结构体
    • 结构体的成员按照声明顺序依次存储在内存中。各个成员变量在内存中是相互独立存储的,它们之间可能存在内存对齐的情况,目的是为了提高内存访问效率。例如,一个结构体中有一个 char 类型成员(占1字节)和一个 int 类型成员(通常占4字节),char 之后可能会填充一些字节,使得 int 成员的地址满足其对齐要求(通常是4字节对齐)。
  2. 联合体
    • 联合体所有成员共享同一块内存空间,其大小取决于占用内存最大的成员。例如,一个联合体中有一个 char 类型成员(占1字节)和一个 int 类型成员(通常占4字节),该联合体的大小就是4字节,因为 int 成员占用空间最大。联合体在同一时间只能有一个成员处于有效状态,对一个成员的赋值会覆盖其他成员的值。

计算内存大小示例

  1. 结构体
#include <iostream>

struct MyStruct {
    char a; // 1字节
    int b;  // 4字节,假设32位或64位系统下int占4字节
    short c; // 2字节
};

int main() {
    std::cout << "MyStruct size: " << sizeof(MyStruct) << " bytes" << std::endl;
    return 0;
}

在上述代码中,MyStruct 结构体中,a 占1字节,由于 int 通常4字节对齐,a 后可能填充3字节,b 占4字节,c 占2字节,又因为整体要满足最大对齐数(这里是 int 的4字节对齐),c 后可能再填充2字节。所以 sizeof(MyStruct) 结果通常为1 + 3 + 4 + 2 + 2 = 12字节。 2. 联合体

#include <iostream>

union MyUnion {
    char a; // 1字节
    int b;  // 4字节,假设32位或64位系统下int占4字节
    short c; // 2字节
};

int main() {
    std::cout << "MyUnion size: " << sizeof(MyUnion) << " bytes" << std::endl;
    return 0;
}

在上述代码中,MyUnion 联合体中,由于所有成员共享内存,其大小取决于最大成员 int,所以 sizeof(MyUnion) 结果为4字节。