SGI STL的两个空间配置器

2013年4月25日 由 Creater 留言 »

1.标准空间配置器std::allocator,这个配置器符合标准,但是性能相对来说差一点,不推荐使用。
2.特殊的空间配置器std::alloc,这个也是默认的配置器。

先来看看标准空间配置器std::allocator

template <class T>
inline T* allocate(ptrdiff_t size, T*) {
    set_new_handler(0);
    T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
    if (tmp == 0) {
	cerr << "out of memory" << endl; 
	exit(1);
    }
    return tmp;
}

template <class T>
inline void deallocate(T* buffer) {
    ::operator delete(buffer);
}

template <class T>
class allocator {
public:
    typedef T value_type;
    typedef T* pointer;
    typedef const T* const_pointer;
    typedef T& reference;
    typedef const T& const_reference;
    typedef size_t size_type;
    typedef ptrdiff_t difference_type;
    pointer allocate(size_type n) { 
	return ::allocate((difference_type)n, (pointer)0);
    }
    void deallocate(pointer p) { ::deallocate(p); }
    pointer address(reference x) { return (pointer)&x; }
    const_pointer const_address(const_reference x) { 
	return (const_pointer)&x; 
    }
    size_type init_page_size() { 
	return max(size_type(1), size_type(4096/sizeof(T))); 
    }
    size_type max_size() const { 
	return max(size_type(1), size_type(UINT_MAX/sizeof(T))); 
    }
};

class allocator<void> {
public:
    typedef void* pointer;
};

可以看出,这个配置器,只是对new和delete的简单封装。其中的每个函数,每个类型都是标准所需要的。
再来下一节看看特殊的空间配置器std::alloc。

广告位

发表评论

你必须 登陆 方可发表评论.