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
也服从内存对齐技术。关于内存对齐,见此。
不是说这周活多吗,怎么又摸了吖(¬㉨¬)
复习课上的,不算摸(