联合大小因意外的单词对齐而变化[重复]

问题描述 投票:0回答:1

我有一个结构体和一个定义如下的联合体

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 字节的联合大小)实际上会影响大小。

c struct sizeof unions memory-alignment
1个回答
0
投票

似乎在使用的系统中

sizeof( char * )
等于
8
,

因此数据成员

c
的地址应该可以被
8
整除以便对齐。

但是数据成员

lala
无法提供这样的对齐方式,例如将单位类型的对象放置在数组中。因此该单元附加了 4 个字节来保证 fata 成员的这样的对齐
c

© www.soinside.com 2019 - 2024. All rights reserved.