【发布时间】:2020-07-26 08:11:14
【问题描述】:
我有一个明确大小的结构如下:
typedef struct
{
unsigned long A : 4;
unsigned long B : 12;
union
{
unsigned long C1 : 8;
unsigned long C2 : 8;
unsigned long C3 : 8;
};
unsigned long D : 8;
}FooStruct;
这个结构体的总大小理论上应该是32bit(4字节)。但是,我使用 sizeof 获得了 12 字节大小,所以这里应该有一些填充和对齐。
我只是不明白为什么和在哪里。有人可以向我解释一下这个结构是如何在内存中占用 12 个字节的吗?
【问题讨论】:
-
typedef struct是c还是c++?在c++我们不需要 typedef。 -
是的,我的意思是明确使用的总位数,没有任何填充。但是如果每个字段的填充达到 4 字节,它将是 16 字节。我只是不明白它是如何变成 12 字节的。
-
@drescherjm,不会改变任何事情。我测试了两个签名。刚刚复制了这个。
-
位字段也是实现定义的,我想你的编译器不共享联合和非联合数据。
-
@Jarod42,问题是,我这里要么有 4 个字段,要么有 6 个字段。无论如何,对于其中任何一个来说,12 都是一个非常不寻常的大小。这似乎前两个字段合并为 2 个字节并填充两个,联合占用另外 2 个字节,它们填充 2 以及最后一个字段。但是由于某种原因,最后一个字段没有与联合合并。