sizeof一个包含4个6位成员的结构

时间:2017-11-10 14:09:10

标签: c++ struct bit sizeof

为什么这段代码:

#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 ...

1 个答案:

答案 0 :(得分:1)

来自CppReference: Bit Fields

  

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

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

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

是的,它是实现定义的(即由编译器决定)。

  

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

是的,因为在第一种情况下,价值观将会跨越&#34;跨越&#34;如果没有填充字节边框,而在另外两个例子中,它们不会填充。

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