C++ union的大小和一些使用想法

73 阅读1分钟

今天在翻书时,看到提到union,才想起自己基本没怎么在项目里用过这个。所以今天正好试试:

1. union 的大小

先来看一段代码。

union MyUnion {

    int intVal; // 整数值
    double doubleVal;
    float floatVal;
    char charVal;
    char charArr[10]; // 字符数组
};

其中,单个来看,charArr[10] 是size最大的,那么MyUnion的大小会是所有的加起来,还是只是其中size最大的成员的大小呢。

答案是:

image.png

为什么呢?这也很好理解,和struct一样,都存在内存对齐。在64位处理器中,内存对齐的单位一般是8字节,因此根据最大成员的10字节,补齐则是16字节。 当然,我们为了验证是不是8字节对齐,可以修改charArr[] 的大小到 17,如果是8字节对齐,则输出应该是24。

image.png

没错,就是8字节。

2.union未赋值的成员值是多少

MyUnion myUnion2;
myUnion2.intVal = 100;
std::cout<<"my union2 intVal : "<<myUnion2.intVal<<std::endl;
//
std::cout<<"my union2 doubleVal : "<<myUnion2.doubleVal<<std::endl;

image.png

是未定义的值,并不是想象中的将int强转为double。