【问题标题】:Size of structure - padding and alignment结构的大小 - 填充和对齐
【发布时间】:2020-07-26 08:11:14
【问题描述】:

我有一个明确大小的结构如下:

typedef struct
{
    unsigned long                   A : 4;
    unsigned long                   B : 12;
    union
    {
        unsigned long               C1 : 8;
        unsigned long               C2 : 8;
        unsigned long               C3 : 8;
    };
    unsigned long                   D : 8;
}FooStruct;

这个结构体的总大小理论上应该是32bit(4字节)。但是,我使用 sizeof 获得了 12 字节大小,所以这里应该有一些填充和对齐。

我只是不明白为什么和在哪里。有人可以向我解释一下这个结构是如何在内存中占用 12 个字节的吗?

【问题讨论】:

  • typedef structc 还是c++?在 c++ 我们不需要 typedef。
  • 是的,我的意思是明确使用的总位数,没有任何填充。但是如果每个字段的填充达到 4 字节,它将是 16 字节。我只是不明白它是如何变成 12 字节的。
  • @drescherjm,不会改变任何事情。我测试了两个签名。刚刚复制了这个。
  • 位字段也是实现定义的,我想你的编译器不共享联合和非联合数据。
  • @Jarod42,问题是,我这里要么有 4 个字段,要么有 6 个字段。无论如何,对于其中任何一个来说,12 都是一个非常不寻常的大小。这似乎前两个字段合并为 2 个字节并填充两个,联合占用另外 2 个字节,它们填充 2 以及最后一个字段。但是由于某种原因,最后一个字段没有与联合合并。

标签: c++ sizeof


【解决方案1】:

联合强制开始一个新的 unsigned long,联合之后的成员又是一个 unsigned long。假设 long 是 4 个字节,这意味着您的结构将有 3 个无符号 long,总共 12 个字节。虽然由三个大小相同的成员组成的工会也似乎很奇怪。

如果您希望它的大小为 4 字节,为什么不将其更改为:

typedef struct
{
    unsigned short                   A : 4;
    unsigned short                   B : 12;

    union
    {
        unsigned char               C1 : 8;
        unsigned char               C2 : 8;
        unsigned char               C3 : 8;
    };

    unsigned char                   D : 8;
}FooStruct;

【讨论】:

  • 这有道理,所以前两个字段共享4个字节,联合自己占用4个字节,最后一个字段再占用4个字节?
  • “工会力量”不确定,它是实现定义的。
【解决方案2】:

另外,如果你使用 gcc 并且想要禁用结构填充,你可以使用__attribute__((packed)):

struct FooStruct
{
    unsigned long                   A : 4;
    unsigned long                   B : 12;
    union
    {
        unsigned long               C1 : 8;
        unsigned long               C2 : 8;
        unsigned long               C3 : 8;
    } __attribute__((packed)) C;
    unsigned long                   D : 8;
} __attribute__((packed));

但请注意,某些架构可能会对未对齐的数据访问进行处罚或根本不允许这样做。

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 2018-03-04
    • 2021-05-28
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2012-06-23
    相关资源
    最近更新 更多