我对工会以及他们如何分配内存感到困惑。说我有:
union Values
{
int ivalue;
double dvalue;
};
Values v;
所以我知道int使用了4个字节而double使用了8个字节,因此总共分配了8个字节(我认为),用v
表示将使用多少内存?
答案 0 :(得分:2)
您已经回答了自己的问题:给定一个四字节int
和一个8字节double
,v
将使用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
。