我已经读过sizeof联合给出了union中最大的成员大小。但是当我这样做时:我得到了意外的结果:

#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的大小,以将intdouble对齐。这样,不管哪个成员处于 Activity 状态,union都将对齐为64位。
如果改为使用float创建联合,则它很可能具有36的大小,因为不需要这种对齐。

union U
{
    int arr[9];
    float x;
};
请注意,此行为是由实现定义的,并且从理论上讲double也可能是32位大。因此,您永远不要依赖它。

关于c++ - union 的大小给意外的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63431813/

10-15 10:55