c++ - boolean 值对位域的优势

标签 c++ boolean bit-fields

我工作的代码库很旧。虽然我们用 C++11 编译几乎所有东西。许多代码是多年前用 c 语言编写的。在旧领域开发新类(class)时,我总是发现自己必须在匹配旧方法和采用更现代的方法之间做出选择。

在大多数情况下,我更愿意尽可能坚持使用更现代的技术。然而,我经常看到的一种常见的旧做法是位域,我很难争论它的使用。我们传递了很多消息,在这里,很多时候,它们充满了单位值。举个例子:

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”来说明从用户的角度来看,它们可以是相同的。我意识到也许您可以为下一个开发人员说明可读性,但除此之外,是否有理由避免使用位字段?我知道压缩字段会影响性能,但因为这些都是字符,所以填充规则仍然有效。

最佳答案

使用位域时需要考虑几件事情。这些是(重要性顺序取决于情况)

  • 表现

位域操作在设置或读取时会导致性能下降(与直接类型相比)。 codegen 的一个简单示例显示了发出的额外指令:https://gcc.godbolt.org/z/DpcErN然而,位域提供更紧凑的数据,这对缓存更友好,并且可以完全抵消额外操作的任何缺点。了解真实性能影响的唯一方法是在真实用例中对实际应用程序进行基准测试。

  • ABI 互操作性

位字段的字节顺序是实现定义的,因此两个编译器生成的相同结构的布局可能不同。

  • 可用性

没有绑定(bind)到位域的引用,您也不能获取它的地址。这可能会影响代码并使其不那么清晰。

关于c++ - boolean 值对位域的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262298/

相关文章:

c++ - 在 C++ 中使用 boolean 数组减少错误

c# - 在 C# 中,如何轻松地将枚举标志从一种类型映射到另一种类型?

c++ - C++ 中带位字段的结构体大小不相加

python - 为什么 "a == x or y or z"总是评估为 True?我如何将 "a"与所有这些进行比较?

c++ - 如何打印从总和倒数到 1 的 2 个数字的总和

c++ - 如何在 vector 中搜索元素?

c++ - 键盘输入和 Win32 消息循环

javascript - 如何在 JavaScript 中将 boolean 值合并到字符串中

C++ 2位位域数组可能吗?

c++ - invoke_result_t<> 没有将 lambda 与引用参数匹配