...one of the most highly regarded and expertly designed C++ library projects in the world.
— Herb Sutter 和 Andrei Alexandrescu, C++ 编码标准
boost::container::pmr::memory_resource
// In header: <boost/container/pmr/memory_resource.hpp> class memory_resource { public: // public member functions virtual ~memory_resource(); void * allocate(std::size_t, std::size_t = max_align); void deallocate(void *, std::size_t, std::size_t = max_align); bool is_equal(const memory_resource &) const noexcept; // friend functions bool operator==(const memory_resource &, const memory_resource &) noexcept; bool operator!=(const memory_resource &, const memory_resource &) noexcept; // protected member functions virtual void * do_allocate(std::size_t, std::size_t) = 0; virtual void do_deallocate(void *, std::size_t, std::size_t) = 0; virtual bool do_is_equal(const memory_resource &) const = 0; // public data members BOOST_STATIC_CONSTEXPR std::size_t max_align; };
memory_resource 类是一个抽象接口,指向封装内存资源的无界类集合。
memory_resource
公有成员函数virtual ~memory_resource();
效果: 销毁此 memory_resource。
void * allocate(std::size_t bytes, std::size_t alignment = max_align);
效果: 等效于 return do_allocate(bytes, alignment);
void deallocate(void * p, std::size_t bytes, std::size_t alignment = max_align);
效果: 等效于 return do_deallocate(bytes, alignment);
bool is_equal(const memory_resource & other) const noexcept;
效果: 等效于 return do_is_equal(other);
memory_resource
友元函数bool operator==(const memory_resource & a, const memory_resource & b) noexcept;
返回值: &a == &b || a.is_equal(b)
。
bool operator!=(const memory_resource & a, const memory_resource & b) noexcept;
返回值: !(a == b)。
memory_resource
保护成员函数virtual void * do_allocate(std::size_t bytes, std::size_t alignment) = 0;
要求: 对齐方式应为 2 的幂。
返回值: 派生类应实现此函数,以返回指向已分配存储的指针,该存储的大小至少为 bytes。如果支持指定的对齐方式,则返回的存储将按指定的对齐方式对齐;否则,它将与 max_align 对齐。
抛出: 如果派生类实现无法分配具有请求大小和对齐方式的内存,则应抛出适当的异常。
virtual void do_deallocate(void * p, std::size_t bytes, std::size_t alignment) = 0;
要求: p 应从先前对与 *this 相等的内存资源调用 allocate(bytes, alignment)
返回,并且 p 处的存储应尚未被释放。
效果: 派生类应实现此函数以处置已分配的存储。
抛出: 无。
virtual bool do_is_equal(const memory_resource & other) const = 0;
返回值: 派生类应实现此函数,以在可以从 other 释放由此分配的内存,反之亦然时返回 true;否则应返回 false。 [注意:other 的最派生类型可能与此类型不匹配。对于派生类 D,此函数的典型实现将计算 dynamic_cast<const D*>(&other)
,如果它返回 nullptr,则不再继续(即,返回 false)。 - 尾注]。