Войти
ПрограммированиеФорумОбщее

std::pmr::monotonic_buffer_resource

#0
8:18, 20 ноя 2023

Кто-нибудь пользовался новыми аллокаторами? Как узнать, сколько места осталось в ресурсе?
В исходниках есть переменная _M_avail, но она в private секции.

#1
(Правка: 17:04) 16:31, 20 ноя 2023

Dimich
> Как узнать, сколько места осталось в ресурсе
в std нет такой возможности, только в boost'e. Можно расширить своим классом унаследовав от std::pmr::monotonic_buffer_resource. Например:

#include <iostream>
#include <memory_resource>

class MyMonotonicBufferResource : public std::pmr::monotonic_buffer_resource
{
public:
   MyMonotonicBufferResource(void* buffer, std::size_t size)
       : std::pmr::monotonic_buffer_resource(buffer, size)
   {
       total_size = size;
   }

   std::size_t get_remaining_space() const
   {
       return total_size - used_space;
   }

protected:
   void* do_allocate(std::size_t bytes, std::size_t alignment) override
   {
       used_space += bytes;
       return std::pmr::monotonic_buffer_resource::do_allocate(bytes, alignment);
   }

   void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override
   {
       used_space -= bytes;
       std::pmr::monotonic_buffer_resource::do_deallocate(p, bytes, alignment);
   }

private:
   std::size_t total_size = 0;
   std::size_t used_space = 0;
};

int main()
{
    char buffer[1024];
    MyMonotonicBufferResource mbr(buffer, sizeof(buffer));

    // Используйте resource для выделения памяти...
    //std::pmr::vector<int> v(&mbr);

    // Получить количество оставшегося места в буфере
    std::size_t remaining = mbr.get_remaining_space();
    std::cout << "Available space: " << remaining << " bytes" << std::endl;

    return 0;
}
#2
17:23, 20 ноя 2023

Просто полиморфные аллокаторы выглядят как то что надо для embedded, а там хотелось бы знать, сколько осталось памяти.

#3
17:27, 20 ноя 2023

Funtik
used_space += bytes;

void* __p = std::align(__alignment, __bytes, _M_current_buf, _M_avail)

где _M_avail - это ссылка.
Я хз, можно ли копировать это поведение чисто для подсчёта.

ПрограммированиеФорумОбщее