联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小。
例1
#include <iostream>
using namespace std;
union u1
{
double a;
int b;
};
union u2
{
char a[13];
int b;
};
union u3
{
char a[13];
char b;
};
int main()
{
cout <<"The size of u1 = "<<sizeof(u1) << endl;
cout <<"The size of u2 = "<<sizeof(u2) << endl;
cout <<"The size of u3 = "<<sizeof(u3) << endl;
return 0;
}
不仅仅union,对于别的复合数据类型,如union、struct、class的对齐方式为成员中最大的成员对齐方式。
1.对于u1来说,大小就是最大的double类型成员a
2.对于u2来说,最大的空间是char[13]类型的数组。由于int数据b的存在,u2的对齐方式变成4。
3.对于u3来说,最大的空间是char[13]类型的数组。
例2
#include <iostream>
using namespace std;
#pragma pack(2)
union u
{
char a[9];
int a;
};
int main()
{
cout <<"The size of u = "<<sizeof(u) << endl;
return 0;
}
对齐是可以更改的,使用#pragma pack(x)可以改变编译器的对其方式。
C++固有类型的对齐取编译器对齐方式与自身大小中较小的一个。
例2中手动更改了对齐方式为2,int对齐方式为4,自身对齐为2,去最小者,
所以 sizeof(u)= 10。