maaGames
@maaGames
Погроммирую программы

Как подсчитать необходимый размер буфера для monotonic_buffer_resource?

Ведь в этот буфер записыаются не только данные, но и указатели на следующие/предыдущие узлы и что-либо ещё, если контейнеру приспичет. Можно в рантайме/компильтайме как-то из контейнера получить размер "узла", чтобы помножить его на предполагаемое число элементов и сделать буфер нужного размера? Под узлом подразумевается не объект с хранимыми данными, а пользовательские данные + служебные данные, необходимые для реализации контейнера.

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. Это я проверил по факту, сколько использовалось в буфере.

Я знаю количество элементов и данные из контейнера не удаляются, поэтому я могу сразу выделить буфер... но не могу вычислить необходимый размер.
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Например, в std::vector определяется тип value_type - это как раз тип элемента вектора.
Можете использовать конструкции типа:
sizeof(decltype(vector_val)::value_type)
или
sizeof(decltype(vector_val.back()))

для вычисления размера элемента вектора, где vector_val - существующий экземпляр вектора
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час