【问题标题】:Bool Flags vs. Unsigned Char Flags布尔标志与无符号字符标志
【发布时间】:2018-01-16 22:24:53
【问题描述】:

免责声明:如果我在这篇文章中提出任何虚假声明,请纠正我。

考虑一个包含八个 bool 成员变量的结构。

/*
 * Struct uses one byte for each flag.
 */
struct WithBools
{
  bool f0 = true;
  bool f1 = true;
  bool f2 = true;
  bool f3 = true;
  bool f4 = true;
  bool f5 = true;
  bool f6 = true;
  bool f7 = true;
};

分配给每个变量的空间是一个字节长度,如果变量仅用作标志,这似乎是一种浪费。就变量而言,减少这种浪费空间的一种解决方案是将八个标志封装到一个 unsigned char 成员变量中。

/*
 * Struct uses a single byte for eight flags; retrieval and
 * manipulation of data is achieved through accessor functions.
 */
struct WithoutBools
{
  unsigned char getFlag(unsigned index)
  {
    return flags & (1 << (index % 8));
  }
  void toggleFlag(unsigned index)
  {
    flags ^= (1 << (index % 8));
  }

private:
  unsigned char flags = 0xFF;
};

标志是通过检索和操作的。位运算符,并且该结构为用户提供了一个接口来检索和操作标志。虽然减少了标志大小,但我们现在有两个额外的方法来增加结构的大小。我不知道如何衡量这种差异,因此我无法确定上述结构之间的任何波动。

我的问题是:

1)这两个结构之间的空间差异可以忽略不计吗?

2) 一般来说,这种通过将布尔集合压缩成单个字节来“优化”布尔集合的方法是个好主意吗?无论是在嵌入式系统环境中还是在其他环境中。

3) C++ 编译器是否会进行这样的优化,在可能和适当的情况下压缩布尔集合。

【问题讨论】:

  • 知道std::vector is specialized on bool 做这种事情可能会让你感兴趣。
  • 处理这个问题的更明显的方法(假设需要它)是use bitfields,它可以使用bool数据类型,同时让编译器处理移位和掩码你。 std::vector&lt;bool&gt; 是对任意数量字段的概括(但它有一些怪癖,使其作为任意集合类型的直接替代品存在问题)。
  • 这是速度/空间的权衡。这可能是也可能不是优化,具体取决于您的要求。
  • 还有std::bitset

标签: c++


【解决方案1】:

我们现在有两个额外的方法来增加 结构体

方法是代码,不会增加结构的大小。只有数据构成结构的大小。

3) C++ 编译器是否会做出这样的优化来压缩 尽可能适当地收集布尔值。

这听起来很响亮。不允许编译器改变数据类型。

1) 这两个结构之间的空间差异是 可以忽略不计?

不,这两种方法之间肯定存在大小差异。

2)通常,这种“优化”布尔集合的方法是 通过将它们压缩成一个字节是个好主意吗?无论是在一个 嵌入式系统上下文或其他。

通常是的,对标志建模的惯用方法是在无符号整数内进行按位操作。根据需要的标志数量,您可以使用std::uint8_tstd::uint16_t 等。

但是,最常见的建模方法不是像您所做的那样通过索引,而是通过掩码。

【讨论】:

    【解决方案2】:

    这两个结构之间的空间差异可以忽略不计吗?

    这取决于您要存储的值的数量以及存储它们的空间。大小差异为 1 到 8。

    通常,这种通过将布尔集合压缩为单个字节来“优化”布尔集合的方法是个好主意吗?无论是在嵌入式系统环境中还是在其他环境中。

    同样,这取决于有多少值和多少空间。另请注意,处理位而不是字节会增加代码大小和执行时间。

    许多嵌入式系统具有相对较少的 RAM 和大量的闪存。代码存储在闪存中,因此增加的代码大小可以忽略不计,节省的内存在小型 RAM 系统上可能很重要。

    C++ 编译器是否会进行这样的优化,在可能和适当的情况下压缩布尔集合。

    假设它可以。我认为这是一种激进的空间优化,但会牺牲执行时间。

    STL 对 vector&lt;bool&gt; 有一个专门化,出于性能原因我经常避免使用它 - vector&lt;char&gt; 更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2014-10-03
      • 2017-10-12
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多