我正在寻找类似于STL向量的东西,但可以处理例如12,16,20,24,32和40位长的整数。 vector<uint16_t>
和vector<uint32_t>
可以很好地处理16位和32位的情况,但是我无法找到任何方法来处理其他情况。请注意,这种方式的全部目的是节省内存和带宽,因此填充不是一种选择。
我的数据结构可以推断整数的最高有效位(int64),因此我只想存储LSB。每个整数位和整数个数在创建时是已知的,但不是编译时。理想情况下,每个整数的位数可以是12到40之间的任何值,但是由于性能原因或者需要在编译时需要设置每个整数位的结构,所以层是可以的。
vector<bool>
和dynamic_bitset可以创建位域,但它们仅限于1位整数。有人知道其他的东西吗?
答案 0 :(得分:4)
STL中没有。
我理解您的性能问题,特别是内存问题。然而,未对齐的读取(需要位移)可能比常规读取(在字节边界上)慢,所以我建议保持整个字节。这意味着:
uint16_t
uint8_t
或1 uint32_t
(权衡速度/内存)uint32_t
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
来调整向量内存使用量。