ステートレス メモリ プール アロケータ クラスがあります。
template<typename T>
class pool_allocator {
public:
using value_type = T;
using pointer = value_type *;
/* Default constructor */
constexpr pool_allocator( void ) noexcept = default;
/* Converting constructor used for rebinding */
template<typename U>
constexpr pool_allocator( const pool_allocator<U> & ) noexcept {}
[[nodiscard]] pointer allocate( size_t n, [[maybe_unused]] const pointer hint = nullptr ) const noexcept {
return get_pool().allocate( n );
}
void deallocate( pointer ptr, size_t n ) const noexcept {
get_pool().deallocate( ptr, n );
}
private:
/* Must be defined in particular .cpp files */
/* POINT OF INTERREST HERE: */
static auto & get_pool( void ) noexcept;
};
背後にあるロジックはget_pool()
、T のインスタンスが割り当てられる定義済みの型の特定のメモリ プールを返すことを目的としたメンバー関数の特殊化です。たとえば、次のようになります。
class sample { ... };
.cpp ファイル:
memory_pool<sample, 10> sample_storage; // memory pool capable of holding up to 10 instances of 'sample'
最後に、.cpp ファイルの get_pool() 関数テンプレートの特殊化があります。
template<>
auto & pool_allocator<sample>::get_pool( void ) noexcept {
return sample_storage; // return the memory_pool instance defined above
}
問題は、そのようなテンプレートの特殊化が .cpp コンパイル ユニットでのみ使用可能であり、他のコンパイル ユニットでの使用を妨げることです(関数テンプレートの特殊化の本体が使用できないため、プレースホルダーauto get_pool()
のタイプをauto
推測できません)。get_pool()
auto
そのため、 の戻り値の型としてどうにかして取り除きたいと思いget_pool()
ます。
memory_pool
私が直面している問題は、主にアロケータ自体が認識していないのサイズに関するものです。とにかく、memory_pool は私の実装でもあるので、必要な採用 (たとえば、さらなるusing
宣言やその他の必要なもの) を行うことができます。それのちょうど骨組み:
template<typename T, size_t CAPACITY>
class memory_pool {
public:
using element_type = T;
using pointer = element_type *;
constexpr size_t capacity( void ) noexcept {
return CAPACITY;
}
...
};