【问题标题】:sizeof a struct with 4 6-bit members [duplicate]具有 4 个 6 位成员的结构的 sizeof [重复]
【发布时间】:2017-11-10 14:09:09
【问题描述】:

为什么是这个代码:

#include <iostream>
struct S {
    unsigned char a:6, b:6, c:6, d:6;
};
    int main(int argc, char *argv[]) {
    std::cout << sizeof(S);
    return 0;
}

返回 4?它的大小不应该是 4 x 6 = 24b = 3B 吗?相比之下,这段代码:

struct S { unsigned char a:4, b:4, c:4, d:4; };

返回一个 2,而这个:

struct S { unsigned char a:4, b:4, c:4, d:4, e:4, f:4; };

返回一个 3...

【问题讨论】:

  • @YSC 好吧,我不知道如何表达这个问题。我去那边看看。谢谢。
  • 位字段不保证成员的大小与您提供的位数完全相同。类型的大小也不会被限制为其成员的总和。
  • @YSC 所以,答案是 - 这取决于编译器?
  • @FrançoisAndrieux 因此,即使编译器计算其他 2 个没有填充,它也会添加第一个填充?
  • @underscore_d 您应该投票关闭该重复项,因此如果此问题关闭,它将包含在重复项中。

标签: c++ struct bit sizeof


【解决方案1】:

来自CppReference: Bit Fields

位域的以下属性是实现定义的:

  • [...]
  • 关于类对象中位域的实际分配细节的一切

    • 例如,在某些平台上,位字段不跨越字节,而在其他平台上却是

所以是的,它是实现定义的(即取决于编译器)。

那么,即使编译器计算其他 2 个没有填充,它也会添加填充第一个?

是的,因为在第一种情况下,如果不填充,值会“跨越”字节边界,而在其他两个示例中,它们不会。

同样,这是实现定义的,可以在另一个平台、同一平台上的不同编译器,甚至同一编译器的不同版本上以不同方式处理。

【讨论】:

  • 这正是我在那里读到的,但是在测试时发现类似的例子给出了不同的结果,这让我很困惑。谢谢。
猜你喜欢
  • 2021-03-02
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多