【问题标题】:sizeof union giving unexpected results联合的大小给出了意想不到的结果
【发布时间】:2020-08-15 23:50:15
【问题描述】:

我已经读过 sizeof union 给出了 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]”的情况相同),什么内部发生在这里?

【问题讨论】:

  • 原因是内存对齐。

标签: c++ unions


【解决方案1】:

因为double 在您的后端是一个 64 位类型,所以编译器会将union 的大小填充额外的 32 位或 4 个字节以对齐 ints 和 double。这样,union 对齐到 64 位,无论哪个成员处于活动状态。

如果您使用float 创建联合,则它的大小很可能为36,因为不需要这样的对齐。

union U 
{
    int arr[9];
    float x;
};

请注意,此行为是由实现定义的,理论上double 也可能是 32 位大。所以你永远不应该依赖它。

【讨论】:

  • 大小和对齐是两个不同的东西。但是,大多数平台也将 64 位浮点数与 8 字节边界对齐。
猜你喜欢
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
  • 2017-11-05
相关资源
最近更新 更多