【问题标题】:Library, which helps packing structures with good performance库,帮助打包具有良好性能的结构
【发布时间】:2011-10-20 17:01:04
【问题描述】:

几天前我听说(也许我什至见过!)关于库,它有助于打包结构。不幸的是 - 我不记得它的名字了。

在我的程序中,我必须保留大量数据,因此我需要打包它们并避免在间隙上丢失位。例如:我必须保留 1...5 范围内的许多数字。如果我将它们保存在 char 中 - 它需要 8 位,但这个数字可以保存在 3 位上。此外 - 如果我将这些数字保存在 8 位的包中,最大数字为 256,我可以在那里打包 51 个数字(而不是 1 或 2!)。

是否有任何图书馆可以帮助执行此操作,还是我自己可以执行此操作?

【问题讨论】:

  • 我认为您正在寻找位域。
  • 需要维护秩序吗?如果没有,请查看 Radix-tree/Crit-bit 树。其中键是数字(1...5),值是所述数字的出现次数。这是网络路由器如何跟踪这么多 IP 地址的一种方法。
  • ASN.1 或 google protobuf 可能吗?根据您的需要,也许是 zlib。
  • 大量数据有多大?您愿意花多少速度来减少应用程序的内存大小?
  • 大约有10^8条记录,每条至少4B。我将不得不保留它两次(从不同的角度)。我想对每个数据进行线性访问。

标签: c++ performance data-structures


【解决方案1】:

正如 Tomalak Garet'kal 已经提到的,这是 ANSI C 的一个特性,称为位域。 wikipedia article 非常有用。通常,您将它们声明为结构。

对于您的示例:正如您所提到的,您有一个 0..5 范围内的数字,您可以在该数字上使用 3 位,这样您就可以使用 5 位:

struct s
{
    unsigned int mynumber : 3;
    unsigned int myother : 5;
}

这些现在可以像这样简单地访问:

struct s myinstance;
myinstance.mynumber = 3;
myinstance.myother = 1;

请注意,位字段比通常的结构成员/变量,因为运行时必须执行位移/掩码以允许访问简单位。

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2011-12-19
    • 2011-08-09
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多