我有一个结构体和一个定义如下的联合体
struct aa{
float j;
char aaa;
char bbb;
int bb;
}aaaa; sizeof(aaaa) 12bytes
union utag{
char bb;
float kk;
char *c;
struct aa lala;
}haha; sizeof(haha) 16bytes
我的编译器告诉我 sizeof(aaaa) 是 12,sizeof(haha) 是 16。
我确实理解 sizeof(aaaa) 是 12,因为我有 2 字节填充用于 int bb 的 4 字节字对齐。
但是,我不明白为什么我的联合哈哈是16字节。我预计它是 12 个字节,因为 struct aa 类型是里面最大的元素。
奇怪的是,如果我注释掉联合体中的 char *c 元素,sizeof(哈哈)就会如预期的那样变成 12 字节。
union utag{
char bb;
float kk;
//char *c;
struct aa lala;
}haha; sizeof(haha) 12bytes
我搜索了重复的问题,但没有其他问题表明已经字对齐的结构(12字节)添加填充字节(在本例中使其为16)的情况,或者删除不影响联合元素的情况联合的大小(删除 8 字节的 char * 不应更改结构元素已经是 16 字节的联合大小)实际上会影响大小。
似乎在使用的系统中
sizeof( char * )
等于8
,
因此数据成员
c
的地址应该可以被8
整除以便对齐。
但是数据成员
lala
无法提供这样的对齐方式,例如将单位类型的对象放置在数组中。因此该单元附加了 4 个字节来保证 fata 成员的这样的对齐c
。