Тёмная тема
Кто-нибудь пользовался новыми аллокаторами? Как узнать, сколько места осталось в ресурсе?
В исходниках есть переменная _M_avail, но она в private секции.
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; }
Просто полиморфные аллокаторы выглядят как то что надо для embedded, а там хотелось бы знать, сколько осталось памяти.
Funtik
used_space += bytes;
void* __p = std::align(__alignment, __bytes, _M_current_buf, _M_avail)
где _M_avail - это ссылка.
Я хз, можно ли копировать это поведение чисто для подсчёта.