【问题标题】:Is there a vector that can handle integers of nonstandard bit-lengths?是否有可以处理非标准位长整数的向量?
【发布时间】:2011-09-05 03:04:39
【问题描述】:

我正在寻找类似于 STL 向量但可以处理例如 12、16、20、24、32 和 40 位长的整数。 vector<uint16_t>vector<uint32_t> 很好地处理了 16 位和 32 位的情况,但我还没有找到任何方法来处理其他情况。请注意,采用这种方式的全部目的是节省内存和带宽,因此不能选择填充。

我的数据结构可以推断出整数的最高有效位(即 int64),因此我只想存储 LSB。每个整数的位数和整数数量在创建时是已知的,但在编译时是未知的。理想情况下,每整数位数可以是 12 到 40 之间的任何值,但出于性能原因或使用需要在编译时设置每整数位数的结构,层是可以的。

vector<bool>dynamic_bitset 可以创建位域,但仅限于 1 位整数。有谁知道其他的吗?

【问题讨论】:

  • 您需要自己进行移位和屏蔽。
  • @Henning,我有一个原型系统可以做到这一点,但我试图避免重新发明轮子。我还注意到,在这里获得良好的性能是一件棘手的事情,所以已经调整过的东西会非常受欢迎。
  • 既然你指出这里的目标是节省内存和性能,我已经删除了我原来的答案(因为它更适合深奥的原因,为什么这是必要的),但我仍然认为vector<uint64_t> 可能是最好的解决方案。然后你甚至不需要推断任何数据,只需存储整个值。
  • @Chad,如果我可以使用 20 位整数而不是 64 位整数,那么这意味着我可以解决 3 倍大的问题。这是一个巨大的好处。
  • 如果您的问题只需要 20 位整数,可以。但它最多需要 40 位整数。除非您可以将问题分解成更小的部分(意味着一个问题集中只有 20 位整数,而另一个问题集中只有 32 位整数),否则您不太可能找到一刀切的解决方案。

标签: c++ boost stl


【解决方案1】:

STL 中没有。

我了解您对性能的担忧,尤其是内存问题。然而,未对齐的读取(需要位移位)可能比常规读取(在字节边界上)慢,所以我建议保留整个字节。这意味着:

  • 12位,16位:uint16_t
  • 20 位,24 位:3 uint8_t 或 1 uint32_t(权衡速度/内存)
  • 32 位:uint32_t
  • 40 位:5 个uint8_t、3 个uint16_t 或1 个uint64_t

假设您选择更简单的解决方案(即,总是碰到下一个可用整数),您可以使用类似:

boost::variant<
  std::vector<uint16_t>,
  std::vector<uint32_t>,
  std::vector<uint64_t>
>

这使您可以根据需要存储的字节数选择在运行时使用的确切 vector

如果您想尽可能多地节省,那么您只需在列表中添加一个std::vector&lt;uint8_t&gt;。但我会避免这样做,也许只“打包” 40 位的情况(在 uint16_t 中),因为其他人从不浪费太多内存......而且我可能会分析检查这两种选择。

注意:您可能还希望通过检查capacity 没有超过size 太多来调整向量内存使用情况。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2021-11-23
    • 2010-12-08
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多