Я думаю, что ваш единственный вариант - написать собственный распределитель поверх вашего boost :: pool и использовать его для получения указателей на память.Вы можете начать с первого взгляда, посмотрев Как использовать библиотеку boost :: pool для создания пользовательского распределителя памяти для записи такого распределителя.
В основном этот настраиваемый распределитель будет выделять большой массивпамяти (по крайней мере, один) и вернуть указатели на блоки и данные с boost :: pool.Измените первый ответ предыдущего поста так, чтобы он не зависел от размера T, а от нестандартного размера, передаваемого как параметр.Этот размер должен быть sizeof(Block) + data_length
.
Теперь, что вы могли бы сделать, это обмануть и изменить свой класс:
class Block
{
uint8_t* data;
};
Теперь, когда вы просите новый Block
, вы получаете не только Block
, но и блок данных впоследствии.Когда вы создаете свой объект (размещение нового), передайте также указатель на новые данные (это будет возвращением allocator + sizeof(Block)
.
Когда данные освобождены, не забудьте сначала вызватьдеструктор, так как это требуется для размещения новых.
Конечно, есть еще много мелких деталей, которые вам придется решить, но это должно дать вам начало.