C++ 课堂见闻(3)

Table of Contents

union 的大小

喜闻乐见的教学事故

#include <cstdio>
using namespace std;

int main(int argc, char const *argv[]){
    typedef union{long i;int k[5];char c;}C;
    C m;
    printf("%d\n", sizeof(m));
    return 0;
}

上述代码的输出结果是?

答案是:取决于编译器。

union 的大小原则上和其中最大的元素大小相等。在上述例子中,最大的元素是int k[5] 所以 sizeof(m) 得到的结果应该是20。

之后,考虑编译器的对齐技术(alignment of the compiler)。为什么在线 IDE 演示的结果是 24 呢?以 cpp.sh 为例,在 About 中可以看到,使用的是 GCC 4.9.2(which, was released on October 30, 2014)。

在这些相当老的编译器中,long 占据 8 Bytes,因此对齐后该 union 占 24 Bytes。

而本机 Windows 上运行的 TDM-GCC,GCC 版本为 10.3.0,即使是 Dev-cpp 自带的 TDM-GCC,版本号也来到了 9.2.0。(以上仅为本机情况)

在这些较新的编译器中,long 只占据 4 Bytes,因此最终 sizeof 的结果是 20。

经测试,空的 union 占据 1 Byte。

By the way,struct 也服从内存对齐技术。关于内存对齐,见此

Share