【发布时间】:2019-03-20 13:48:35
【问题描述】:
我工作的代码库已经很老了。虽然我们用 c++11 编译了几乎所有东西。许多代码是多年前用 c 编写的。在旧领域开发新课程时,我总是发现自己必须在匹配旧方法或采用更现代的方法之间做出选择。
在大多数情况下,我更喜欢尽可能坚持使用更现代的技术。但是,我经常看到的一种常见的旧做法是位域,我很难争论使用它。我们传递了很多消息,在这里,很多时候,它们都充满了单比特值。举个例子:
class NewStructure
{
public:
const bool getValue1() const
{
return value1;
}
void setValue1(const bool input)
{
value1 = input;
}
private:
bool value1;
bool value2;
bool value3;
bool value4;
bool value5;
bool value6;
bool value7;
bool value8;
};
struct OldStructure
{
const bool getValue1() const
{
return value1;
}
void setValue1(const bool input)
{
value1 = input;
}
unsigned char value1 : 1;
unsigned char value2 : 1;
unsigned char value3 : 1;
unsigned char value4 : 1;
unsigned char value5 : 1;
unsigned char value6 : 1;
unsigned char value7 : 1;
unsigned char value8 : 1;
};
在这种情况下,新结构的大小为 8 个字节,旧结构的大小为 1。
我添加了一个“getter”和“setter”来说明从用户的角度来看,它们可以是相同的。我意识到也许您可以为下一个开发人员提供可读性的案例,但除此之外,是否有理由避免使用位字段?我知道压缩字段会影响性能,但因为这些都是字符,所以填充规则仍然存在。
【问题讨论】:
-
当都是单个位时,我看不出使用位域的原因。我可能会选择
std::bitset(或它的邪恶兄弟std::vector<bool>;)
标签: c++ boolean bit-fields