2

与其将单个布尔值存储到一个字节块中,不如将 8 个布尔值存储在同一个块中。

示例:01010101 = 8 个布尔值,1 3 5 7 = 假,2 4 6 8 = 真。

这行得通吗?

有没有更好的办法?

这样做有什么好处和坏处?

这会对网络产生很大影响吗?

4

2 回答 2

0

您可以将vector<bool>其用于此目的,因为它的设计理念是提供空间效率。

vector<bool>是一个伪容器,不包含实际的布尔值,而是旨在节省空间的布尔值的打包表示。在典型的实现中,存储在“向量”中的每个“布尔值”占用一个位,一个八位字节保存八个“布尔值”。

但是这种方法有一个问题:-

假设您想处理向量中的单个布尔值,您将执行以下操作:-

vector<bool> v;
bool *pb = &v[0];

但实际上向量中没有布尔值。当在网络的保护伞下实施时,这可能会产生一些问题,因为您有时需要引用单个布尔值。

于 2014-11-28T05:34:29.613 回答
0

您所描述的通常称为位域;它们通常在空间非常宝贵(在位和字节级别)或者你真的想缩小一些东西时使用。这包括(但不限于):

  • 压缩算法
  • 通用协议,以限制开销
  • 缩小工作数据以适应缓存

否则,就像编程中的大多数其他问题一样,您最好使用为您处理此类低级细节的解决方案,或者让您的代码对人类来说尽可能简单。有时这意味着坚持使用 plain bool,因为它描述了代码的意图。如果你的语言和代码库很容易支持位域,那也很好。为了完整起见,C/C++通过这种结构冒号语法原生地支持位字段:

struct Foo {
    char f1 : 1;
    char f2 : 1;
    char f3 : 1;
    // ...
};

...其中冒号后面的数字表示该字段使用多少位。还有vector<bool>一种,但它是一种现在很少使用的有问题的类型,而且它也更笨拙。

为了更直接地回答您的问题,除非您正在使用开销非常低的网络协议,否则您不太可能需要使用位字段。与网络中通常的时间尺度相比,节省的空间是最小的,如果你真的担心它,你最好使用像协议缓冲区这样的现成解决方案。

于 2014-11-28T05:37:15.803 回答