union 和 struct 的字节大小
Byte size of union and struct
#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;
}
在ubuntu18.04下,这道题的答案是64,但是我想知道struct中的uDATE cow在内存中是如何存储的,或者数据存储的规则?
根据C++标准:
The size of a union is sufficient to contain the
largest of its data members. Each data member is allocated as if it
were the sole member of a struct.
所以联合的内存布局就好像你在那里有一个 long
,那里有一个 5 int
的数组,或者那里有一个 char
,但是间隔开到其中最大的一个(int
s 的数组)。我假设您使用的是 GCC,并且 IIRC GCC 即使在 64 位架构上也为 int
设置了 32 位的大小。因此,UDATE 的大小为 20 字节。因此,您天真地期望 sizeof(struct data) + sizeof(temp)
到 return 52。您显然得到 64 的事实可能是因为 GCC 将事物与 64 位边界对齐,因此 UDATE 占用 24 字节,并在 cat
和 cow
之间插入一个 4 字节的间隔符 data
结构。
请注意,该标准不对类型双关做出任何保证 - 这是一种经常使用的低级技术,其中联合使用一种方法编写并使用另一种方法读取,例如,访问组成一个字节的字节integer - 并声称只能使用编写时使用的相同条目访问联合(除非共享公共初始成员的 POD 结构联合除外)。然而,在实践中如果你只是简单地将一个指针从一种类型转换为另一种类型,我使用过的每个编译器都会以你期望的方式读取内存重新解释或 C 风格转换。
#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;
}
在ubuntu18.04下,这道题的答案是64,但是我想知道struct中的uDATE cow在内存中是如何存储的,或者数据存储的规则?
根据C++标准:
The size of a union is sufficient to contain the largest of its data members. Each data member is allocated as if it were the sole member of a struct.
所以联合的内存布局就好像你在那里有一个 long
,那里有一个 5 int
的数组,或者那里有一个 char
,但是间隔开到其中最大的一个(int
s 的数组)。我假设您使用的是 GCC,并且 IIRC GCC 即使在 64 位架构上也为 int
设置了 32 位的大小。因此,UDATE 的大小为 20 字节。因此,您天真地期望 sizeof(struct data) + sizeof(temp)
到 return 52。您显然得到 64 的事实可能是因为 GCC 将事物与 64 位边界对齐,因此 UDATE 占用 24 字节,并在 cat
和 cow
之间插入一个 4 字节的间隔符 data
结构。
请注意,该标准不对类型双关做出任何保证 - 这是一种经常使用的低级技术,其中联合使用一种方法编写并使用另一种方法读取,例如,访问组成一个字节的字节integer - 并声称只能使用编写时使用的相同条目访问联合(除非共享公共初始成员的 POD 结构联合除外)。然而,在实践中如果你只是简单地将一个指针从一种类型转换为另一种类型,我使用过的每个编译器都会以你期望的方式读取内存重新解释或 C 风格转换。