四、复杂数据类型中sizeof及其数据对齐问题
(1)、union的sizeof问题与cpu的对界
考虑下面问题:(默认对齐方式)
1 union u //8对齐
2 {
3 double a;
4 int b;
5 };
6
7 union u2 //4对齐
8 {
9 char a[13];
10 int b;
11 };
12
13 union u3 //1对齐
14 {
15 char a[13];
16 char b;
17 };
18
19 cout<
20 cout<
21 cout<
22
都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4(4字节对齐),也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。
结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。
编译器对界:
首先解释下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。
通过程序可以改变编译器对界,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。