关于工会和记忆管理的问题

时间:2011-09-22 17:01:37

标签: c++ memory-management unions

我对工会以及他们如何分配内存感到困惑。说我有:

union Values
{
    int ivalue;
    double dvalue;
};

Values v;

所以我知道int使用了4个字节而double使用了8个字节,因此总共分配了8个字节(我认为),用v表示将使用多少内存?

2 个答案:

答案 0 :(得分:2)

您已经回答了自己的问题:给定一个四字节int和一个8字节doublev将使用8个字节的内存。

如果不确定,您可以编译并运行一个打印出sizeof(v)的简单程序。

答案 1 :(得分:0)

鉴于int是4个字节且double是8个字节(语言不保证 ),sizeof (Values)至少 8个字节。

最常见的是它将精确地为8个字节(更常见的是sizeof (int)sizeof (double),以较大者为准),但允许编译器向结构和联合添加未命名的填充。对于结构,任何这样的填充可以在任何两个之间,或在最后一个之后;对于工会来说,它只能在最后。

这种填充的目的是允许更好的对齐。例如,给定:

union u {
    char c[5];
    int i;
};

如果int是4个字节且需要4字节对齐,则编译器必须添加填充以使sizeof (union u)至少为8个字节。

在您的特定情况下,可能没有理由添加任何填充,但您不应该假设没有任何填充。如果您需要知道联合的大小,只需使用sizeof