Home > 程序/算法 > 如何实现一个STL的allocator(内存分配器)

如何实现一个STL的allocator(内存分配器)

December 12th, 2010 Leave a comment Go to comments

注意,这里只是讲如何实现一个“能用的 ”allocator,而不是如何实现一个很高级很牛的allocator。当然,你可以回头自己把它变的很高级很牛。

这里假设你已经知道STL的allocator是做什么用的,如果不知道的话随便打开一个STL容器的代码看一看也能很容易猜到。

话说如果我们只想要一个能工作allocator,那就直接使用STL自带的默认实现好了,但是万一想要自己定制一个,你可能会不知道如何下手,而且你又不想去翻阅c++标准文档,也不想去啃如天书般的STL源码,那就走这条捷径——照抄下面的代码,不需要问为什么。

template<typename Type>

class StlAllocator

{

public:

typedef Type value_type;

typedef value_type* pointer;

typedef const value_type* const_pointer;

typedef value_type& reference;

typedef const value_type& const_reference;

typedef std::size_t size_type;

typedef std::ptrdiff_t difference_type;

public:

template<typename U>

struct rebind

{

typedef StlAllocator<U> other;

};

public:

inline StlAllocator() {}

inline ~StlAllocator() {}

inline StlAllocator(StlAllocator const&) {}

template<typename U>

inline StlAllocator(StlAllocator<U> const&) {}

inline pointer address(reference r) { return &r; }

inline const_pointer address(const_reference r) { return &r; }

inline pointer allocate( size_type cnt, typename std::allocator<void>::const_pointer = 0 )

{

return malloc( cnt * sizeof(Type) );

}

inline void deallocate( pointer p, size_type size )

{

free( p );

}

inline size_type max_size() const

{

return std::numeric_limits<size_type>::max() / sizeof(Type);

}

inline void construct(pointer p, const Type& t) { new(p) Type(t); }

inline void destroy(pointer p) { p->~Type(); }

inline bool operator==(StlAllocator const&) const { return true; }

inline bool operator!=(StlAllocator const& a) const { return !operator==(a); }

};

需要关注的就是allocate和deallocate两个函数,你可以把里面的malloc和free改成你自己的算法。

然后,你就可以这样使用你的allocator了:

std::vector<t, StlAllocator<t> >

Categories: 程序/算法 Tags:
  1. Captain
    April 19th, 2011 at 10:26 | #1

    以前在gdc里也人专门讲这个~http://www.tantalon.com/pete.htm

 

Spam Protection by WP-SpamFree