#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 回答
根据C标准:
所以联合的内存布局就像你有一个
long
那样,那里有一个5int
的数组,或者那里有一个char
,但间隔最大的这些(int
的数组) . 我认为你正在使用GCC,即使在64位架构上,IIRC GCC也为int
设置了32位的大小 . 因此,UDATE的大小为20字节 . 因此,你天真地期望sizeof(struct data) + sizeof(temp)
返回52.你明显得到64的事实可能是因为GCC正在将事物与64位边界对齐,因此对UDATE采用24字节,并插入一个4字节的间隔在data
结构中cat
和cow
之间 .请注意,该标准不保证类型惩罚 - 这是经常使用的低级技术,其中联合使用一种方法编写并使用另一种方法读取,例如,访问组成整数的字节 - 并声称只能使用与其编写的相同条目来访问联合(为共享公共初始成员的POD结构的并集添加例外) . 但是,实际上,如果您只是使用重新解释或C样式转换在联合中将指针从一种类型转换为另一种类型,那么每个编译器都会期望 .