Ведь в этот буфер записыаются не только данные, но и указатели на следующие/предыдущие узлы и что-либо ещё, если контейнеру приспичет. Можно в рантайме/компильтайме как-то из контейнера получить размер "узла", чтобы помножить его на предполагаемое число элементов и сделать буфер нужного размера? Под узлом подразумевается не объект с хранимыми данными, а пользовательские данные + служебные данные, необходимые для реализации контейнера.
constexpr int total_nodes = 10;
// Нужно создать буфер достаточного размера, при этом это не sizeof(int)*total_nodes
constexpr int enoughSize = total_nodes * ???;// enough to fit in all nodes
std::array<std::byte, enoughSize> buffer;
buffer.fill( std::byte{0} );
std::pmr::monotonic_buffer_resource mbr{buffer.data(), buffer.size()};
std::pmr::polymorphic_allocator<int> pa{&mbr};
std::pmr::list<int> list{pa};
for( int i=0; i < total_nodes; ++i )
{
list.push_back( i );
}
Там нужно учесть размер и количество указателей в каждом узле, если они есть. Т.е. влияет разрядность, выравнивание и прочее. Например вот такой код
std::array<std::byte, enoughSize> buffer;
std::pmr::monotonic_buffer_resource mbr{buffer.data(), buffer.size()};
std::pmr::polymorphic_allocator<int> pa{&mbr};
std::pmr::map<int,int> map{pa};
map[1]=1;
map[2]=2;
Требует буфер размером (минимум) 80 байт на х86 и 132 байта на х64. Это я проверил по факту, сколько использовалось в буфере.
Я знаю количество элементов и данные из контейнера не удаляются, поэтому я могу сразу выделить буфер... но не могу вычислить необходимый размер.