是否有一个位集类在实例化时大小,但避免了 boost::d ynamic_bitset<> 的额外分配调用?



是否有一个方便的类似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)

相关内容

最新更新