【问题标题】:Multiple adjacent bit fields in C++C++中的多个相邻位域
【发布时间】:2017-11-30 16:49:51
【问题描述】:

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

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

所以,

  • 它的目的是什么?

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

【问题讨论】:

  • 如果它们不相邻,它们就不是很有用。
  • 主要目的是定义一个匹配硬件定义的类型...
  • @1201ProgramAlarm 这是 c++ 问题,不是 c。 C 和 c++ 不同的语言。
  • @underscore_d 通常对于一个特定的硬件,你有一个特定的编译器......当多个编译器针对同一个硬件时,他们很可能以相同的方式定义这些东西。

标签: c++ structure bit-fields


【解决方案1】:

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

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

【讨论】:

  • 为什么要进行位操作?为什么不包括已知有限大小的整数?
  • @UKMonkey 这取决于您想要实现什么以及您有什么限制;有些人用javascript编程,所有数字都是double :)
  • @AntonMalyshev 我的意思是你说“使用按位运算消耗更少的内存” - 它不仅仅是按位运算,它可以节省空间。而且我不确定是否真的有人在 javascript 中使用“程序”,他们只是打字和哭泣;)
  • 可能值得一提的是,位域在嵌入式或专用编程情况之外几乎没有用(在我看来),因为即使您有一个 4 位的对象,它仍然分配一个字节。同样,如果您说 28 位,则可能不会按预期分配,因为它将剩余的填充到 32。
  • @UKMonkey 确保他们可以自己消耗更少的内存 :) 充分利用它们按位操作通常很方便
【解决方案2】:
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
};

【讨论】:

  • sizeof(x) 对于第一种情况可以是 1,标准中没有规定它应该是 2。
  • 恰恰相反。来自 C99 标准:“如果剩余空间足够,则结构中紧跟另一个位字段的位字段应打包到同一单元的相邻位中”。即使将第二个更改为signed char,结构的大小也是1 个字节。 (我刚刚在 MSVC、GCC 和 Clang、x86、ARM、RISC-V 上用 Godbolt 测试过)
【解决方案3】:

根据c++draft:

3 内存位置要么是标量类型的对象,要么是最大值 相邻位域的序列都具有非零 宽度。[ 注意:语言的各种特征,例如参考和 虚函数,可能涉及额外的内存位置 程序无法访问,但由实施管理。— 结束 注意 ]两个或多个执行线程([intro.multithread])可以 在不相互干扰的情况下访问单独的内存位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多