具有Boost池分配器的自定义线程本地STL分配器

时间:2017-04-28 06:00:14

标签: c++11 memory-management boost dynamic-allocation allocator

我们有一个巨大的遗留代码库,它是多线程的,并且广泛使用向量。为了减少动态内存分配所花费的时间,我们正在转向池。计划是使用带有自定义分配器的Boost小向量。自定义分配器将为每个容器类型创建一个线程本地池。我已经基于上述想法实现了自定义分配器并对其进行了测试。出于某种原因,代码在Boost简单隔离存储中的find_prev方法内部处于无限模式。有许多容器嵌套的地方,例如vector>>这是定义分配器的正确方法吗?

template<typename T, typename allocatorType>
class customAllocator
{
    public:
        static thread_local allocatorType *_allocator;
        typedef T value_type;
        typedef allocatorType allocator_Type;
        template <class X> struct rebind
        {
            typedef customAllocator<X, allocatorType> other;
        };
        customAllocator()
        {
            _allocator = new allocatorType;
            assert(_allocator);
            return;
        }
        ~customAllocator()
        {
            delete _allocator;
            _allocator = nullptr;
            return;
        }
        template<class X, class Y> customAllocator(const customAllocator<X, Y>& other)
        {
            _allocator = other._allocator;
            return;
        }
        template<class X, class Y> customAllocator(customAllocator<X, Y>&& other)
        {
            _allocator = other._allocator;
            other._allocator = nullptr;
            return;
        }
        template<class X, class Y> customAllocator& operator=(const customAllocator<X, Y>& other)
        {
            _allocator = other._allocator;
            return *this;
        }
        template<class X, class Y> customAllocator& operator=(customAllocator<X, Y>&& other)
        {
            _allocator = other._allocator;
            other._allocator = nullptr;
            return *this;
        }
        T* allocate(size_t n)
        {
            return _allocator->allocate(n * sizeof(T));
        }
        void deallocate(T* ptr, size_t n)
        {
            _allocator->deallocate(ptr, n);
            return;
        }
        template<class X, class Y> bool operator==(const customAllocator<X, Y>& other) const noexcept
        { return (*this._allocator == other.allocator);  }
        template<class X, class Y> bool operator!=(const customAllocator<X, Y>& other) const noexcept
        { return !(*this._allocator == other._allocator); }
};
template <typename T1, typename T2>
thread_local T2 *customAllocator<T1, T2>::_allocator = nullptr;

using smallVector = boost::container::small_vector<
T,
    DEFAULT_SMALL_VECTOR_LENGTH,
    customAllocator<T,
    boost::pool_allocator<
    T,
    boost::default_user_allocator_new_delete,
    boost::details::pool::null_mutex,
    2,
    4
    >>>;

0 个答案:

没有答案