免责声明:如果我在这篇文章中提出任何虚假声明,请纠正我。
考虑一个包含八个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集合。
答案 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_t
,std::uint16_t
等等。
然而,最常见的建模方法不是通过索引,而是通过掩码。