Struct和Union在内存大小上的区别

名字起的不好,但是也不知道该叫什么好,题目如下:

typedef union {double i;int k[5];char c;} DATE;
struct data
{
    int i;
    DATE k;
    double j;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(DATE)<<endl;//24
    cout<<sizeof(data)<<endl;//40
    return 0;
}

是否有点晕?我开始就晕了。当然,这与我是菜鸟有着非常大的关系。

我们看,union是取其中最长的那个作为其在内存中的大小,那么显然k最大了,为20,但是结果确实又为24啊!纳尼?

可以这么理解:

首先k是最大的,没错,但究其根本,还是一系列int对象,对不对?既然这样,在DATE中,最长的类型依然是double(废话),而union的大小为最长类型的整数背,所以就为24了。

好,那为啥data只为40呢?按照struct对齐方式,貌似也有点问题吧?

是的,但我们可以这么理解:

DATE从本质上来说,最长的还是double,只要把他想成若干double就行了。

那么i为4,k为24,j为8 ==> 4 + (4) + 24 + 8 = 40

注:()内是补齐

*************************************************

如果,把DATE定义中,数组元素个数改为4,那么用上面的结论,k的大小为16,为double长度的整数倍,则第一个输出应为16,那么第二个就一定为32,实际也结果确实如此。

posted @ 2013-09-06 23:26  immars!  阅读(275)  评论(0编辑  收藏  举报