c++ - 是否有一个 bitset 类在实例化时调整大小,但避免了 boost::dynamic_bitset<> 的额外分配调用?

标签 c++ boost stl bitset allocator

有没有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 的指针.

最佳答案

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

实际上没有必要这样做,因为与 dynamic_bitset 相比,它不会保存任何内容。使用此方法,您有两个部分,指向位对象的指针和对象本身。使用 dynamic_bitset,您将拥有包含指向位的指针的 dynamic_bitset 对象。同样的事情。

关于c++ - 是否有一个 bitset 类在实例化时调整大小,但避免了 boost::dynamic_bitset<> 的额外分配调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760678/

相关文章:

c++ - 清除 boost::array

c++ - 使用 boost :thread 的可运行类

c++ - 我需要 C++ 中的 UnSupportedOperationException

c++ - 如何与 numeric_limits<int64_t>::min() 进行比较

c++ - 图实现的邻接矩阵中的数组 vector 错误

c++ - 地址运算

c++ - 设置读取游标失败

c++ - 将 std::string 中的十六进制值存储在 std::vector 中,反之亦然?

c++ - 如何将屏幕截图写入 PNG?

c++ - 在 os x 10.9.4 上安装 allegro 4?