联合和结构的字节大小

时间:2018-12-09 12:57:30

标签: c++ struct unions

 #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,但是我想知道struct中的uDATE cow如何存储在内存中,或者是数据存储的规则?

1 个答案:

答案 0 :(得分:0)

根据C ++标准:

  

联合的大小足以容纳   其最大的数据成员。每个数据成员的分配就像   是结构的唯一成员。

因此,联合的内存布局与您在其中拥有long,那里有5个int或那里有char的数组相同,但与其中最大的(int个数组)。我假设您正在使用GCC,即使在64位体系结构上,IIRC GCC也会为int设置32位的大小。因此,UDATE的大小为20字节。因此,您天真地期望sizeof(struct data) + sizeof(temp)返回52。您显然得到64的事实可能是因为GCC正在将事物对齐到64位边界,因此将24字节用于UDATE,并插入一个在cat结构中cowdata之间的4字节间隔。

请注意,该标准不能保证类型匹配-这是一种常用的低级技术,在这种技术中,使用一种方法写入并使用另一种方法读取联合,例如,访问组成整数的字节-并声称只能使用与写入时使用的相同条目来访问联合(禁止共享公共初始成员的POD结构的联合例外)。但是,在实践中我曾经使用过的每个编译器都将以您期望的方式读取内存,如果您只是使用reinterpret或C将一个类型的指针从联合中的一种简单地转换为另一种类型的话样式的演员表。