MST

星途 面试题库

面试题:C++ 中 struct 和 union 在数据共享与成员访问限制方面的特性

假设你有一个应用场景,需要存储一个可以是整数、浮点数或者字符的数据,同时要尽量节省内存空间。请用C++的 `union` 来实现这个需求,并说明如何正确访问和修改其中的数据。另外,将其与使用 `struct` 实现相同功能进行对比,阐述各自的优缺点。
37.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

使用 union 实现

#include <iostream>
#include <cstring>

union Data {
    int intValue;
    float floatValue;
    char charValue;
};

int main() {
    Data data;
    // 存储整数
    data.intValue = 42;
    std::cout << "Stored integer: " << data.intValue << std::endl;

    // 存储浮点数
    data.floatValue = 3.14f;
    std::cout << "Stored float: " << data.floatValue << std::endl;

    // 存储字符
    data.charValue = 'A';
    std::cout << "Stored char: " << data.charValue << std::endl;

    return 0;
}

访问和修改数据

  • 访问:根据当前存储的数据类型,直接访问对应的成员变量。例如,如果存储的是整数,就访问 intValue
  • 修改:直接给对应的成员变量赋值即可,例如 data.intValue = newIntValue;

unionstruct 对比

  • union 优点
    • 节省内存union 所有成员共享同一块内存空间,大小为其最大成员的大小,对于存储不同类型但不会同时使用的数据非常节省内存。
  • union 缺点
    • 数据一致性问题:由于所有成员共享内存,当修改一个成员的值时,会覆盖其他成员的值,需要程序员手动维护数据一致性,否则容易导致数据错误。
    • 类型安全问题:没有类型检查机制,可能会错误地访问与当前存储类型不匹配的成员,导致未定义行为。
  • struct 优点
    • 数据独立性struct 的每个成员都有自己独立的内存空间,修改一个成员不会影响其他成员,数据一致性更容易维护。
    • 类型安全:编译器可以对 struct 的成员访问进行类型检查,减少未定义行为。
  • struct 缺点
    • 占用内存多struct 的大小是所有成员大小之和(考虑内存对齐),对于存储不同类型但不会同时使用的数据,会浪费较多内存空间。