微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将内存池分配器耦合到托管已分配实例的各种内存池

如何解决将内存池分配器耦合到托管已分配实例的各种内存池

一个无状态的内存池分配器类:

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占位符的类型不能推断为{{的主体1}} 函数模板特化不可用)

因此我想以某种方式摆脱 get_pool() 作为返回类型 auto

我面临的问题主要是 get_pool() 的大小,这是分配器本身未知的。无论如何,memory_pool 也是我的实现,因此我可以进行任何所需的采用(例如进一步的 memory_pool 声明或其他任何需要)。只是它的骨架:

using

解决方法

这是我使用的解决方案 - 实现包含池大小信息的特征类:

template<typename T>
class memory_pool {
public:
    using traits = memory_pool_traits<T>;
    using element_type = typename traits::element_type;
    using pointer = element_type *;

    static constexpr size_t capacity { traits::capacity };
...
};

分配器:

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:
    static memory_pool<T> & get_pool( void ) noexcept;
};

对于任何特定类型,都应该有traits类:

// Primary template
template<typename T> struct memory_pool_traits;

让我想定义memory_pool的样本:

class sample { ... };

...除此之外,各个 memory_pool 的设置 - 特征:

template<>
struct memory_pool_traits<sample> {
    using element_type = sample;
    static constexpr size_t capacity { 10 };
};

.cpp 文件中有池本身的定义和 get_pool() 函数:

memory_pool<sample> sample_storage;

template<>
memory_pool<sample> & pool_allocator<sample>::get_pool( void ) noexcept {
    return sample_storage;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。