0

是否有一个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);

仅当您在编译时std::vector<std::bitset<bits>>知道时才能执行此操作。bits如果你使用std::vector<boost::dynamic_bitset<>>,那么你会看到一个额外的分配器调用。是否有一种折衷方案可以实现上述 C 代码的平衡?

例如,您可能有一些用于 std::vector<...> 的自定义分配器,它在每个之后留下一些额外的空间boost::dynamic_bitset<>并在那里分配m_block,尽管这可能仍然会花费您的指针m_block

4

2 回答 2

3

可以使用placement new 创建这样的类,但我不知道有一个预先存在的类可以做到这一点。该类不会直接实例化,而是通过工厂构建;工厂方法将用于new分配必要的字节数,然后使用placement new 来初始化缓冲区前面的对象。超过类大小的缓冲区的末尾将是位存储。

在实践中没有必要这样做,因为它不会保存任何东西与dynamic_bitset. 使用此方法,您有两个部分,指向 bits 对象的指针和对象本身。使用 dynamic_bitset 你有一个包含指向位的指针的 dynamic_bitset 对象。一样。

于 2011-10-13T22:11:41.653 回答
1

我为它创建了一张票作为功能请求:票#13016(https://svn.boost.org/trac/boost/ticket/13016

于 2017-05-08T12:28:12.323 回答