自定义数据类型是否可以实现可变尺寸效率?

时间:2014-11-28 02:54:19

标签: c++ mmo data-structures

为什么不在同一个块中存储8个布尔值,而不是将一个布尔值存储到一个字节块中。

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

这会有用吗?

有更好的方法吗?

这样做的优点和缺点是什么?

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

2 个答案:

答案 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等现成的解决方案。