Chinaunix首页 | 论坛 | 博客
  • 博客访问: 220419
  • 博文数量: 36
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 374
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-04 18:21
文章分类

全部博文(36)

文章存档

2011年(1)

2009年(5)

2008年(30)

我的朋友

分类: C/C++

2008-10-27 19:35:25

union u
{
 double a;
 int b;
};
union u2
{
 char a[13];
 int b;
};
union u3
{
 char a[13];
 char b;
};

都知道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++固有类型的对界取编译器对界方式与自身大小中较小的一个。

阅读(1957) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~