分类: C/C++
2008-10-27 19:35:25
都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,
大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最
大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员
int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界
上,所以占用的空间变成了16(最接近13的对界)。
结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对
齐方式.顺便提一下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把
数据放在它的对界上以提高内存命中率。对界是可以更改的,使用#pragma pack(x)宏可以改
变编译器的对界方式,默认是8。C++固有类型的对界取编译器对界方式与自身大小中较小的一
个。例如,指定编译器按2对界,int类型的大小是4,则int的对界为2和4中较小的2。在默认的
对界方式下,因为几乎所有的数据类型都不大于默认的对界方式8(除了long double),所以
所有的固有类型的对界方式可以认为就是类型自身的大小。更改一下上面的程序:
#pragma pack(2)
union u2
{
char a[13];
int b;
};
union u3
{
char a[13];
char b;
};
#pragma pack(8)
由于手动更改对界方式为2,所以int的对界也变成了2,u2的对界取成员中最大的对界,也是2了,所以此时sizeof(u2)=14。
结论:C++固有类型的对界取编译器对界方式与自身大小中较小的一个。