首页 文章

union和struct的字节大小

提问于
浏览
2
#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是如何存储在内存中的,还是数据存储的规则?

1 回答

  • 0

    根据C标准:

    联合的大小足以包含其最大的数据成员 . 每个数据成员都被分配,就好像它是结构的唯一成员一样 .

    所以联合的内存布局就像你有一个 long 那样,那里有一个5 int 的数组,或者那里有一个 char ,但间隔最大的这些( int 的数组) . 我认为你正在使用GCC,即使在64位架构上,IIRC GCC也为 int 设置了32位的大小 . 因此,UDATE的大小为20字节 . 因此,你天真地期望 sizeof(struct data) + sizeof(temp) 返回52.你明显得到64的事实可能是因为GCC正在将事物与64位边界对齐,因此对UDATE采用24字节,并插入一个4字节的间隔在 data 结构中 catcow 之间 .

    请注意,该标准不保证类型惩罚 - 这是经常使用的低级技术,其中联合使用一种方法编写并使用另一种方法读取,例如,访问组成整数的字节 - 并声称只能使用与其编写的相同条目来访问联合(为共享公共初始成员的POD结构的并集添加例外) . 但是,实际上,如果您只是使用重新解释或C样式转换在联合中将指针从一种类型转换为另一种类型,那么每个编译器都会期望 .

相关问题