是否有一个可以处理非标准位长整数的向量?

时间:2011-09-05 03:04:40

标签: c++ boost stl

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

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

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

1 个答案:

答案 0 :(得分:4)

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<uint8_t>即可。但是我不会这样做,也许只是“打包”40位的情况(在uint16_t中),因为其他人从来没有浪费太多的记忆......而且我可能想要检查两种选择。

注意:您可能还希望通过检查capacity是否过多地超出size来调整向量内存使用量。