为什么不在同一个块中存储8个布尔值,而不是将一个布尔值存储到一个字节块中。
示例:01010101 = 8个布尔值,1 3 5 7 =假,2 4 6 8 =真。
这会有用吗?
有更好的方法吗?
这样做的优点和缺点是什么?
这会对网络产生多大影响吗?
答案 0 :(得分:0)
您可以将vector<bool>
用于此目的,因为它是在提供空间效率的基础上设计的。
vector<bool>
是一个伪容器,它不包含实际的bool,而是一个用于节省空间的bool的压缩表示。在典型的实现中,存储在“向量”中的每个“bool”占用一个位,而一个8位字节则占用8个“bool”。
但这种方法存在问题: -
假设您想要解决向量中的单个bool,您可以执行以下操作: -
vector<bool> v;
bool *pb = &v[0];
但实际上矢量中没有bool。当在网络的保护下实施时,这可能会产生一些问题,因为在某些时候需要引用个别的bool。
答案 1 :(得分:0)
您所描述的内容通常称为bit fields;它们通常在空间非常宝贵时使用(在位和字节级别),或者你真的想缩小某些东西。这包括(但不限于):
否则,与编程中的大多数其他问题一样,您最好使用能够为您处理此类低级别详细信息的解决方案,或者尽可能简化代码。有时这意味着坚持使用普通bool
,因为它描述了代码的意图。如果你的语言和代码库很容易支持位字段,那也没关系。为了完整起见,C / C ++通过这种结构冒号语法原生地支持bit fields:
struct Foo {
char f1 : 1;
char f2 : 1;
char f3 : 1;
// ...
};
...冒号后面的数字表示该字段使用的位数。还有vector<bool>
但它是一种有问题的类型,这些日子很少使用,而且它也很笨拙。
要更直接地回答您的问题,除非您正在使用非常低开销的网络协议,否则您不太可能需要使用位字段。与网络中通常的时间尺度相比,节省的空间很小,如果您真的担心它,最好使用protocol buffers等现成的解决方案。