sizeof union 给出意想不到的结果
sizeof union giving unexpected results
我读到 sizeof union 给出了 union.But 中成员的最大大小,当我这样做时 this:i 得到了意想不到的结果:
#include <iostream>
using namespace std;
union RecordType
{
int arr[9];
double x;
};
int main()
{
RecordType t;
cout << sizeof(t); //output is 40,instead of 36 (9*4bytes each)
}
为什么大小是 40 而不是 36,即使我将数组更改为“int arr[10]”,然后 sizeof 给出的输出为 40(与“int arr[9]”的情况相同) ,内部发生了什么?
因为 double
在您的后端是 64 位类型,编译器将用额外的 32 位或 4 个字节填充 union
的大小以对齐 int
s和 double
。这样 union
对齐到 64 位,无论哪个成员处于活动状态。
如果您使用 float
创建一个联合,它的大小很可能是 36
,因为不需要这样的对齐。
union U
{
int arr[9];
float x;
};
请注意,此行为是实现定义的,理论上 double
也可能是 32 位大。所以你永远不应该依赖它。
我读到 sizeof union 给出了 union.But 中成员的最大大小,当我这样做时 this:i 得到了意想不到的结果:
#include <iostream>
using namespace std;
union RecordType
{
int arr[9];
double x;
};
int main()
{
RecordType t;
cout << sizeof(t); //output is 40,instead of 36 (9*4bytes each)
}
为什么大小是 40 而不是 36,即使我将数组更改为“int arr[10]”,然后 sizeof 给出的输出为 40(与“int arr[9]”的情况相同) ,内部发生了什么?
因为 double
在您的后端是 64 位类型,编译器将用额外的 32 位或 4 个字节填充 union
的大小以对齐 int
s和 double
。这样 union
对齐到 64 位,无论哪个成员处于活动状态。
如果您使用 float
创建一个联合,它的大小很可能是 36
,因为不需要这样的对齐。
union U
{
int arr[9];
float x;
};
请注意,此行为是实现定义的,理论上 double
也可能是 32 位大。所以你永远不应该依赖它。