STL之路 - 空间适配器一

空间适配器:空间适配器是STL实现的一个基础。整个STL操作的对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。(这里的空间配置器的空间可以是磁盘或其它辅助的存储介质,在SGI STL中是内存)


空间适配器的标准接口:

以下提供一份std标准的allocator,在SGI中是defalloc.h,但是SGI没有使用它,原因是效率过低,但是作为讲解标准接口是一个比较好的例子

代码:

#ifndef DEFALLOC_H
#define DEFALLOC_H

#include <new.h>
#include <stddef.h>
#include <stdlib.h>
#include <limits.h>
#include <iostream.h>
#include <algobase.h>


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;
};



#endif

首先是各种type:其实就是typedef

allocator:: value_type:  

allocator:: pointer: 

allocator:: const pointer:

allocator:: reference:

allocator:: size_type

allocator:: difference_type:

结合上面的文件,某些类型很容易就知道它要表达的意思,这里只讲一下typedef ptrdiff_t difference_type

ptrdiff_t 这是一个和机器相关的数据类型,它是用来保存两个指针减法操作的结果,通常定义为long int,它必须保证能存放同一数组中两个指针之间的差距(也就是说这个类型要保存两个指针之间距离的大小,比如我对两个同类型的数据取址,ptrdiff_t可以保存两者之间的差值,这个值可正可负,与size_t不一样,size_t用于指明数组长度,必须为正) 


然后是allocator的必要接口:

allocator::rebind:一个嵌套的(nested)class template。class rebind<U>拥有唯一成员other(上文提供的文件中无)

allocator::allocator():默认构造函数

allocator::allocator():复制构造函数

allocator::allocator():泛化的复制构造函数

allocator::~allocator():默认的析构函数

pointer allocator::address(reference x) const:返回某个对象的地址
const_pointer allocator::address(const _reference x) const:返回某个const对象的地址
pointer allocator:: allocate(size_type n, const *void = 0):配置空间,足以存储n个对象,第二个参数是个提示
void allocator:: deallocate(pointer p, size_type n):归还先前配置的空间
size_type allocator::max_size() const:返回可配置的最大量
void allocator::construct(pointer p, const T& x)等同于new (const void*)(p) T(x)
void allocator::destroy(pointer p):等同于p->~T()

这里只补充两个地方:
set_new_handler: 这个和operator new有关,当new无法满足某一内存分配需求时,它会抛出异常,当operator new抛出异常以反映一个未获满足的内存需求之前,他会先调用一个客户指定的错误处理函数,一个所谓的new_handler。客户调用set_new_handler()来指定这个处理函数,set_new_handler是声明于<new>的一个标准程序库函数

namespace std{
 typedef void (*new_handler) ();
 new handler set_new handler(new_handler p) throw(); 
}


new (p) T(value): 在p为起始的内存空间中,调用T的构造函数,将数据初始化到该区域(是这个意思,但是具体是咋样的,我也没弄清楚,之后碰到了补上)




PS:以后能上图尽量上图,多讲点自己认为重要的东西以及自己的理解,抄接口这种事还是算了



猜你喜欢

转载自blog.csdn.net/qq_37925512/article/details/79160708