【问题标题】:Nested struct bitfield alignment in GCCGCC中的嵌套结构位域对齐
【发布时间】:2017-12-27 14:53:50
【问题描述】:

我正在使用 g++ (GCC) 4.7.2.20121109,我想要一个与位边界对齐的嵌套结构。举个例子吧:

#include <iostream>

using namespace std;

typedef struct {
   unsigned int a : 1;
   unsigned int b : 7;
} __attribute__( ( packed ) ) myType1;

typedef struct {
   unsigned int a : 1;
   struct {
      unsigned int b : 7;
   } __attribute__( ( packed ) );
} __attribute__( ( packed ) ) myType2;

int main(void)
{
   cout << "sizeof( myType1 ) = " << sizeof( myType1 ) << endl;
   cout << "sizeof( myType2 ) = " << sizeof( myType2 ) << endl;
}

用“g++ filename.cpp -o output”编译,给我:

sizeof( myType1 ) = 1
sizeof( myType2 ) = 2

myType1 具有我期望的大小,但 myType2 没有。我希望 sizeof(myType2) 是 1 而不是 2。这可能吗?

【问题讨论】:

  • 不是专家,但我认为这是不可能的,因为即使myType2 的内部结构是匿名的,它仍然是一个结构,所以你需要能够解决它,并且因此它至少需要与sizeof(char)对齐。
  • 嵌套结构不再是位域,应该遵循对齐要求。所以,我不认为这是可能的。顺便说一句,您不需要嵌套结构上的属性。
  • @Serge 如果我不在嵌套结构中使用__attribute__( ( packed ) ),则 sizeof 是 5 而不是 2。
  • 嗯,那么 gcc 文档不正确 :(
  • 您可以使用 -Wpadding 来查看编译器在做什么(clang++ 比 g++ 更冗长)。使用 -Wpedantic 编译器抱怨匿名结构是 GNU 扩展。关于结构填充的一个很好的参考是 catb.org/esr/structure-packing 。但是,所描述的行为对我来说仍然是个谜。

标签: c++ gcc


【解决方案1】:

匿名嵌套结构声明了一个新的类对象,因此其中的任何位域都将独立于外部类中的任何位域。在一个类中,位域被“打包到某个可寻址的分配单元中”。这种包装不跨越类中的不同对象。

然后是语言规范中的 [class.bit]:

类对象中位域的分配是实现定义的。位域的对齐方式是实现定义的。

这意味着编译器可以随意处理位域(尽管确实需要记录这种行为)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2023-03-27
    • 2013-10-16
    • 2011-10-10
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多