C ++中的多个相邻位字段

时间:2017-11-30 16:49:52

标签: c++ structure bit-fields

我在浏览cppreference时看到了多个相邻的位字段。

unsigned char b1 : 3, : 2, b2 : 6, b3 : 2;

所以,

  • 它的目的是什么?

  • 我应该在何时何地使用它?

3 个答案:

答案 0 :(得分:1)

显然,使用按位操作消耗更少的内存。例如,这对于嵌入式编程可能很重要。

您也可以使用std::vector<bool>,它可以(通常也会)实现位域实现。

答案 1 :(得分:0)

Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined)

如果您希望编译器在多位字段分配期间不添加填充或执行结构对齐,则可以在单个变量中编译它们。

struct x
{
  unsigned char b1 : 4;  // compiler will add padding after this. adding to the structure size.
  unsigned char b2 : 3; // compiler will add padding here too!  sizeof(x) is 2.
}


struct y
{
    unsigned char b1 : 4, : 3;   // padding will be added only once.  sizeof(y) is 1
}

或者,如果您想在单个变量中分配更大的位字段

struct x
{
    unsigned char b1 :9;   //warning: width of 'x::b1' exceeds its type
};


struct y
{
    unsigned char b1 :6, :3;   //no warning
};

答案 2 :(得分:0)

根据c++draft

  

3 内存位置是标量类型的对象或最大值   相邻位域的序列都具有非零值   宽度。 [注:语言的各种功能,如引用和   虚函数可能涉及额外的内存位置   程序无法访问,但由implementation.- end管理   注意]两个或多个执行线程([intro.multithread])可以   访问单独的内存位置而不会相互干扰。