Chinaunix首页 | 论坛 | 博客
  • 博客访问: 844977
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 16:14:12

[不要只做技术]在论坛上问如下代码结果为什么是24?

union DATE
{
    char a;
    int i[5];
    double b;
};

DATE max;

cout<< sizeof(max) << endl;

这个问题很好回答,并且我把这个问题归结于基本概念题(就是入门书必须介绍的)。我想一般来说,做过内存管理的,对这个语言特性肯定不会陌生。

摘几句The C Programming Language里面讲述这个问题的原话,以说明读书还是必要的:
①联合就是一个结构,②它的所有成员相对于基地址的偏移量都为0,③此结构空间要大到足够容纳最“宽”的成员,④并且,其对齐方式要适合于联合中所有类型的成员。

怕有的兄弟还不明白,特附图一个帮助理解:

 

char a; => x                                              
int i[5]; =>

 x

 x

 x

 x

 x

x

double b; =>

 x

 

 


该结构要放得下int i[5]必须要至少占4×5=20个字节。如果没有double的话20个字节够用了,此时按4字节对齐。但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的,所以必须添加4个字节使其满足8×3=24,也就是必须也是8的倍数,这样一来就出来了24这个数字。综上所述,最终联合体的最小的size也要是所包含的所有类型的基本长度的最小公倍数才行。(这里的字节数均指winnt下的值,平台、编译器不同值也有可能不同。)

联合在存储分配的时候用的机会最多,因为很少有像存储分配这样需要给多种不同类型的变量分配空间而又打算尽可能的节约内存的,这很适合联合的特性。上述对齐的方式有个很有趣的用法也就常在存储分配里面使用。(下面依旧用The C Programming Language中的例子作答)

typedef long Align;

union header {
    struct {
        union header *ptr;
        unsigned size;
    } s;
    Align x;
}

这里的Align有什么用?作用只有一个,就是强迫分配的结构体按long的长度对齐。

爱书吧,它是知识的源泉!~~

-------------
乾坤一笑 写于2005年8月8日  转载请标明出处和原文链接


--------------------next---------------------
我不是很清楚你的gcc编译器。但是可以肯定,如果不做内存对齐,是不可能的。没有内存对齐,会导致CPU的数据cache交换,严重影响性能。但,为什么缺省对齐到8字节,而不是4字节,一直不是很清楚,怀疑可能是因为最大的基本存储内型的长度的原因。(以前以为是和SIMD有关,好像那也应该16啊!所以,一直迷迷糊糊的)

可以看看VC6和VC7的项目设置,代码生成的设置(缺省是默认,也就是8字节对齐)。至于gcc的缺省对齐是怎么样的,我猜测也是8字节的。

你说的跑游戏的,在你以前的blog里看的过。

我这里写#pragma只是用来指明内存对齐的,不用#pragma指定也可以的,在项目属性上设置就可以了(不修改,缺省的是8字节对齐,所以也就是你说的24。但是,如果对齐到4字节,所以,我给了那段代码,运行看看(可以去掉#pragma然后在设置上指明4字节对齐))。
--------------------next---------------------

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