Bool标志与未签名的Char标志

时间:2018-01-16 22:24:53

标签: c++

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

考虑一个包含八个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)一般来说,这种方法是优化&#34;通过将它们压缩成单个字节的一个bool集合是一个好主意?无论是在嵌入式系统环境中还是其他方面。

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

2 个答案:

答案 0 :(得分:1)

  

这两种结构之间的空间差异是否可以忽略不计?

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

  

一般来说,这种方法是优化&#34;通过将它们压缩成单个字节的一个bool集合是一个好主意?无论是在嵌入式系统环境中还是其他方面。

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

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

  

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

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

由于性能原因,我经常避免使用vector<bool>的STL专长 - vector<char>要快得多。

答案 1 :(得分:1)

  

我们现在有两个额外的方法可以增加大小   结构

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

  

3)C ++编译器是否会进行这样的优化以压缩a   尽可能适当地收集bools。

这是响亮的声音。不允许编译器更改数据类型。

  

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

不,两种方法之间肯定存在尺寸差异。

  

2)一般来说,这种方法是“优化”一组bool   通过将它们压缩成单个字节是一个好主意?在一个   嵌入式系统上下文或其他。

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

然而,最常见的建模方法不是通过索引,而是通过掩码。