Предварительно выделенный пул памяти для объектов с массивом фиксированного размера - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть тип со следующей структурой:

class Block
{
   /* few fixed size fields*/
   ...

   /* fixed size byte array*/
   std::unique_ptr<std::uint8_t[]> data;
}

Эти объекты используются в рабочем конвейере, и таких объектов будет много.Размер data является параметром времени выполнения, но он известен до начала работы и не изменяется позже.

Я хочу использовать пул памяти (в частности, boost :: pool / boost :: object_pool)чтобы предварительно выделить множество таких объектов с таким макетом, чтобы за каждым Block объектом следовал его массив data.

Как мне этого добиться?

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, что ваш единственный вариант - написать собственный распределитель поверх вашего boost :: pool и использовать его для получения указателей на память.Вы можете начать с первого взгляда, посмотрев Как использовать библиотеку boost :: pool для создания пользовательского распределителя памяти для записи такого распределителя.

В основном этот настраиваемый распределитель будет выделять большой массивпамяти (по крайней мере, один) и вернуть указатели на блоки и данные с boost :: pool.Измените первый ответ предыдущего поста так, чтобы он не зависел от размера T, а от нестандартного размера, передаваемого как параметр.Этот размер должен быть sizeof(Block) + data_length.

Теперь, что вы могли бы сделать, это обмануть и изменить свой класс:

class Block
{
    uint8_t* data;
};

Теперь, когда вы просите новый Block, вы получаете не только Block, но и блок данных впоследствии.Когда вы создаете свой объект (размещение нового), передайте также указатель на новые данные (это будет возвращением allocator + sizeof(Block).

Когда данные освобождены, не забудьте сначала вызватьдеструктор, так как это требуется для размещения новых.

Конечно, есть еще много мелких деталей, которые вам придется решить, но это должно дать вам начало.

...