...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
The header <boost/core/memory_resource.hpp>
defines the class boost::core::memory_resource
, a portable equivalent
of std::pmr::memory_resource
from C++17.
This is not a complete implementation of the standard <memory_resource>
header; for such, one should use Boost.Container. The abstract base class
is only provided by Core so that Boost libraries that provide and take advantage
of PMR facilities such as concrete implementations of memory resources, or
implementations of polymorphic_allocator
,
can interoperate.
namespace boost { namespace core { class memory_resource { public: virtual ~memory_resource() = default; [[nodiscard]] void* allocate( std::size_t bytes, std::size_t alignment = max_align ); void deallocate( void* p, std::size_t bytes, std::size_t alignment = max_align ); bool is_equal( memory_resource const & other ) const noexcept; private: virtual void* do_allocate( std::size_t bytes, std::size_t alignment ) = 0; virtual void do_deallocate( void* p, std::size_t bytes, std::size_t alignment ) = 0; virtual bool do_is_equal( memory_resource const& other ) const noexcept = 0; }; inline bool operator==( memory_resource const& a, memory_resource const& b ) noexcept; inline bool operator!=( memory_resource const& a, memory_resource const& b ) noexcept; } // namespace core } // namespace boost
[[nodiscard]] void* allocate( std::size_t bytes, std::size_t alignment
= max_align
);
do_allocate( bytes, alignment
)
.
void deallocate( void*
p,
std::size_t bytes, std::size_t alignment =
max_align );
do_deallocate( bytes, alignment
)
.
bool is_equal( memory_resource
const&
other )
const noexcept;
do_is_equal( other
)
.
void*
do_allocate(
std::size_t bytes, std::size_t alignment )
= 0;
bytes
and
alignment at least alignment
.
std::bad_alloc
or derived) when storage
with the specified size and alignment could not be obtained.
void do_deallocate( void*
p,
std::size_t bytes, std::size_t alignment )
= 0;
do_allocate
.
bool do_is_equal( memory_resource
const&
other )
const noexcept
= 0;
true
if memory allocated from *this
can be deallocated from other
and vice-versa, otherwise
false
.
bool operator==( memory_resource
const&
a,
memory_resource const& b ) noexcept;
&a == &b
|| a.is_equal( b )
.
bool operator!=( memory_resource
const&
a,
memory_resource const& b ) noexcept;
!(
a ==
b )
.