Есть ли класс bitset, который имеет размер во время создания экземпляра, но избегает дополнительного вызова выделения boost :: dynamic_bitset <>? - PullRequest
0 голосов
/ 14 октября 2011

Существует ли удобный аналог 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.

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Было бы возможно создать такой класс, используя размещение new, но я не знаю о существующем ранее классе, который делает это. Класс не будет создан напрямую, но будет построен через фабрику; фабричный метод будет использовать new для выделения необходимого количества байтов, а затем использовать размещение new для инициализации объекта в начале буфера. Конец буфера после размера класса будет хранилищем битов.

На практике это не нужно делать, потому что это ничего не спасает против dynamic_bitset. С помощью этого метода у вас есть две части: указатель на объект бит и сам объект. С dynamic_bitset у вас есть объект dynamic_bitset, который содержит указатель на биты. То же самое.

1 голос
/ 08 мая 2017

Я создаю для него билет в виде запроса на добавление: Ticket # 13016 (https://svn.boost.org/trac/boost/ticket/13016)

...