GCC中的嵌套结构位域对齐

时间:2017-12-27 14:53:51

标签: c++ gcc

我使用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;
}

使用&#34; g ++ filename.cpp -o output&#34; 进行编译,给我:

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

myType1的大小是我期待的,但myType2还没有。我喜欢sizeof(myType2)是1而不是2.有可能吗?

1 个答案:

答案 0 :(得分:0)

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

然后在语言规范的[class.bit]中出现了这个:

  

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

这意味着无论感觉如何,编译器都可以自由地使用位域(虽然这种行为确实需要记录)。