【发布时间】: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::vectoris specialized onbool做这种事情可能会让你感兴趣。 -
处理这个问题的更明显的方法(假设需要它)是use bitfields,它可以使用
bool数据类型,同时让编译器处理移位和掩码你。std::vector<bool>是对任意数量字段的概括(但它有一些怪癖,使其作为任意集合类型的直接替代品存在问题)。 -
这是速度/空间的权衡。这可能是也可能不是优化,具体取决于您的要求。
-
还有
std::bitset。
标签: c++