c++ - 自定义数据类型是否是可变大小效率的可能且可行的选择?

标签 c++ mmo data-structures

与其将单个 bool 值存储到一个字节 block 中,不如将 8 个 bool 值存储到同一个 block 中。

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

这行得通吗?

有没有更好的办法?

这样做有什么优点和缺点?

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

最佳答案

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

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

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

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

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

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

关于c++ - 自定义数据类型是否是可变大小效率的可能且可行的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27182408/

相关文章:

c++ - 如何在 C++ 中将一点移向另一点?

php - 寻找 php 游戏引擎/框架

Scala:排序子集最合适的数据结构是什么?

c++ - 递增数组变量时需要不一致的左值错误

c++ - 错误 : expected primary-expression before ‘=’ token when using for loops

c++ - TCLAP 中的 vector 参数

javascript - Node.js + Phaser MMO

c - 多线程应用程序的数据结构(以及 C 语言的跨平台实现)

javascript - 在 Javascript 中创建和访问对象数组

c++ - 英特尔 C++ 和微软编译器