我具有以下工会:
union Variant{
char txt[10];
double floating_point;
};
当我尝试打印sizeof(Variant)
(输出16个字节)时,会感到困惑。
为什么它不输出10个字节而不是16个字节?如果union占用与其最大成员一样多的内存,则应该max(sizeof(char[10]), sizeof(double))
否?
如果在我的系统中double
占用8个字节,这6个字节到底从哪里来?
答案 0 :(得分:1)
由于alignment位于8字节边界上,因为union的最大成员double
的大小可能是您计算机上的8
个字节。如果您使用的是int
而不是double
,则大小可能为12
。
char
数组的大小为10
字节,因为它有十个元素。大于最大成员double
的大小8
。因此,下一个可能的对齐方式是2 * 8
,即16
。
如果您的数组包含8个或更少的元素,则联合的大小将为8
,等等。
答案 1 :(得分:0)
为什么它不输出10个字节而不是16个字节?如果union占用与其最大成员一样多的内存,则应该执行max(sizeof(char [10]),sizeof(double))no吗?
结构或类的大小是具有最大alignment requirement的成员的对齐方式的倍数。在此,该成员为double
,其对齐方式为8,即alignof(double) == 8
和alignof(Variant) == alignof(double)
。