您的位置:首页 > 其它

STL一级空间配置器(SGI版本)

2011-11-23 10:01 399 查看
SGI中空间一级配置器的。主要是借助malloc,free,realloc函数实现。以下的代码是摘自stl_alloc.h头文件。

template <int __inst>

class __malloc_alloc_template {

private:

static void*_S_oom_malloc(size_t); //out of memory时malloc

static void*_S_oom_realloc(void*, size_t); //out of memory 时realloc

#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG

static void (*__malloc_alloc_oom_handler)(); //out of memory时处理函数。

//这个函数我们可以自己设置,通过调用__set_malloc_handler

#endif

public:

static void*allocate(size_t __n) //malloc一块空间

{

void*__result = malloc(__n); //__result指向这块空间

if (0 ==__result) __result = _S_oom_malloc(__n); //如果内存不够时。

return__result;

}

static voiddeallocate(void* __p, size_t /* __n */) //释放空间

{

free(__p);

}

static void*reallocate(void* __p, size_t /* old_sz */, size_t __new_sz) //realloc

//一块空间,同样也是在realloc失败时调用_S_oom_realloc。

{

void*__result = realloc(__p, __new_sz);

if (0 ==__result) __result = _S_oom_realloc(__p, __new_sz);

return__result;

}

//设置类似与c++ new handler的内存不足的处理程序

static void (*__set_malloc_handler(void (*__f)()))()

{

void (*__old)() = __malloc_alloc_oom_handler;

__malloc_alloc_oom_handler = __f;

return(__old);

}

};

// malloc_alloc out-of-memory handling

#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG

template <int __inst>

void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)()= 0;

#endif

//内存不足时的空间分配

template <int __inst>

void*

__malloc_alloc_template<__inst>::_S_oom_malloc(size_t__n)

{

void (*__my_malloc_handler)();

void*__result;

for (;;) {

__my_malloc_handler = __malloc_alloc_oom_handler;//默认的内存不

//足的处理程序没有。如果我们不自己去写一个处理的函数,那么在内存不足的

//时候就会直接抛出异常。

if (0 ==__my_malloc_handler) { __THROW_BAD_ALLOC; }

(*__my_malloc_handler)(); //如果我们有自己设定了一个处理的函数,

//在内存不足的时候,首先要调用这个处理的函数,处理完毕后,再次去申请空

//间,申请得到就返回指向这块空间的地址,如果失败的话,就要继续去处理,

//申请,····

__result= malloc(__n);

if(__result) return(__result);

}

}

//这是reallco内存不足时的内存申请。

template <int __inst>

void*__malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n)

{

void (*__my_malloc_handler)();

void*__result;

for (;;) {

__my_malloc_handler = __malloc_alloc_oom_handler;

if (0 ==__my_malloc_handler) { __THROW_BAD_ALLOC; }

(*__my_malloc_handler)();

__result= realloc(__p, __n);

if(__result) return(__result);

}

}

typedef __malloc_alloc_template<0> malloc_alloc;

//这个只是一个标准的接口,对于SGI的stl,由于他是具有次层配置。除了一级

//配置以外,还有二级配置,而且二级配置更加复杂。但是我们调用的时候不会

//去关系是应该调用一级还是二级,只是调用这个接口。然后让这个接口去负责//调用一级还是二级配置

template<class _Tp, class _Alloc>

class simple_alloc {

public:

static _Tp*allocate(size_t __n)

{ return 0== __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }

static _Tp*allocate(void)

{ return(_Tp*) _Alloc::allocate(sizeof (_Tp)); }

static voiddeallocate(_Tp* __p, size_t __n)

{ if (0 !=__n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }

static voiddeallocate(_Tp* __p)

{_Alloc::deallocate(__p, sizeof (_Tp)); }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: