联合体和结构体的字节大小

3
 #include <iostream>
 using namespace std;
 typedef union {
            long i;
            int k[5];
            char c;
 } UDATE;
 struct data {
            int cat;
            UDATE cow;
            double dog;
  } too;
 UDATE temp;
 int main()
 {
        cout << sizeof(struct data)+sizeof(temp) << endl;
        return 0;
  }

在Ubuntu 18.04下,这个问题的答案是64,但我想知道在内存中如何存储结构体中的uDATE cow,或者数据存储的规则是什么?

当你说“这个问题的答案是64”时,你是否意味着所显示程序的输出64 - Some programmer dude
是的,请使用gcc 7.3.0。 - Sheng Er
感谢您的回答。 - Sheng Er
1个回答

1
根据C++标准:
联合体的大小足以容纳其最大的数据成员。每个数据成员都被分配,就好像它是结构体的唯一成员一样。
因此,联合体的内存布局与您在那里有一个long、一个5个int的数组或一个char的情况相同,但间隔为这些中最大的(即int数组)。我假设你正在使用GCC,并且我IRC GCC在64位架构上为int设置了32位的大小。因此,UDATE将具有20字节的大小。因此,您可能会天真地期望sizeof(struct data) + sizeof(temp)返回52。您似乎得到64的事实可能是因为GCC将事物对齐到64位边界,因此UDATE需要24字节,并在data结构中的catcow之间插入4字节的间隔。
请注意,标准对类型转换不做任何保证——这是一种常用的低级技术,其中联合使用一种方法进行写入,另一种方法进行读取,例如访问构成整数的字节,并声称联合只能使用与其编写时相同的条目进行访问(除了共享公共初始成员的POD结构体的联合外)。然而,在实践中,我所使用过的每个编译器都会以您期望的方式读取内存,如果您仅使用重新解释或C风格转换在联合中将指针从一种类型转换为另一种类型。

@ShengEr 在 Stack Overflow 上,您不需要添加评论来感谢回答者,只需记得给有用的答案点赞并接受最佳答案即可。这就是我们需要的一切感谢 :) - Jack Aidley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接