MST

星途 面试题库

面试题:C++ union在复杂数据结构压缩中的应用

假设有一个复杂数据结构,包含多种不同类型成员,例如int、float和char数组,要使用union进行数据压缩,应如何设计union结构以及相应的操作逻辑?请给出代码示例并解释其原理。
26.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 设计union结构
    • union可以让不同类型的成员共享同一块内存空间,从而实现一定程度的数据“压缩”。假设我们的复杂数据结构包含intfloatchar数组,我们可以设计如下的union:
#include <stdio.h>
#include <string.h>

union ComplexData {
    int intValue;
    float floatValue;
    char charArray[4];
};
  1. 操作逻辑及代码示例
    • 由于union成员共享内存,在使用时要注意同一时间只能使用其中一个成员。下面是一个简单的示例展示如何使用这个union:
int main() {
    union ComplexData data;

    // 使用intValue成员
    data.intValue = 10;
    printf("intValue: %d\n", data.intValue);

    // 使用floatValue成员(此时intValue的值会被覆盖)
    data.floatValue = 3.14f;
    printf("floatValue: %f\n", data.floatValue);

    // 使用charArray成员(此时floatValue的值会被覆盖)
    strcpy(data.charArray, "test");
    printf("charArray: %s\n", data.charArray);

    return 0;
}
  1. 原理解释
    • 在上述代码中,union ComplexData定义了一个联合体,其中intValuefloatValuecharArray共享同一块内存空间。这块内存空间的大小取决于最大成员的大小,在这个例子中,intfloat通常是4字节,charArray长度为4,也是4字节,所以整个union占用4字节。
    • 当给intValue赋值时,数据存储在共享的内存空间中。之后给floatValue赋值,原来intValue的数据就被覆盖了,因为它们共享同一块内存。同理,给charArray赋值也会覆盖之前floatValue的数据。这种特性使得union在某些场景下可以有效节省内存空间,但使用时需要小心确保同一时间只有一个成员是有效的。

如果是C++语言,基本思路类似,代码如下:

#include <iostream>
#include <cstring>

union ComplexData {
    int intValue;
    float floatValue;
    char charArray[4];
};

int main() {
    union ComplexData data;

    // 使用intValue成员
    data.intValue = 10;
    std::cout << "intValue: " << data.intValue << std::endl;

    // 使用floatValue成员(此时intValue的值会被覆盖)
    data.floatValue = 3.14f;
    std::cout << "floatValue: " << data.floatValue << std::endl;

    // 使用charArray成员(此时floatValue的值会被覆盖)
    std::strcpy(data.charArray, "test");
    std::cout << "charArray: " << data.charArray << std::endl;

    return 0;
}

原理和C语言中的union是一样的,都是成员共享内存空间,同一时间只有一个成员是有效的。