是否有一个方便的类似std::bitset<>
的实例化时动态大小,但避免boost::dynamic_bitset<>
所需的额外分配
你可以很容易地在C语言中创建动态大小的位集,如:
typedef struct { node_t node; block_t bits[0]; } node_bitset_t;
p = (node_bitset_t *)malloc( (sizeof(node_t) + sizeof(block_t)*blocks) * array_size);
只有在编译时知道bits
时才可以使用std::vector<std::bitset<bits>>
。如果您使用std::vector<boost::dynamic_bitset<>>
,那么您将看到一个额外的分配器调用。是否有一个妥协,实现上述C代码的平衡?
你可能有一些自定义的分配器,例如std::vector<…>在每个boost::dynamic_bitset<>
之后留下一些额外的空间,并在那里分配m_block
,尽管这可能仍然会占用m_block
的指针。
可以使用placement new创建这样的类,但我不知道是否存在这样的类。类不会被直接实例化,而是通过工厂来构建;工厂方法将使用new
来分配所需的字节数,然后使用placement new来初始化缓冲区前端的对象。超过类大小的缓冲区的末尾为位存储空间。
dynamic_bitset
相比,它不会保存任何内容。使用这个方法,您有两个部分,一个指向bits对象的指针和对象本身。使用dynamic_bitset,你有dynamic_bitset对象,它包含指向位的指针。同样的事情。 我在boost中为它创建了一个票证作为特性请求:票证#13016 (https://svn.boost.org/trac/boost/ticket/13016)