sizeof(联合)这个值是怎么计算的?
本文来源:http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html
[不要只做技术]在论坛上问如下代码结果为什么是24?
1 2 3 4 5 6 7 8 9 10 | 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中的例子作答)
1 2 3 4 5 6 7 8 9 | typedef long Align; union header { struct { union header *ptr; unsigned size; } s; Align x; } |
这里的Align有什么用?作用只有一个,就是强迫分配的结构体按long的长度对齐。
爱书吧,它是知识的源泉!~~