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)); }
};
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)); }
};
相关文章推荐
- SGI版本空间配置器
- STL源码:空间配置器(三)内存的配置和释放、SGI的两级适配器
- STL源码剖析学习笔记之具备次配置力(sub-allocation)的SGI空间配置器
- STL — 浅析一级空间配置器
- STL学习_SGI空间配置器_第一级配置器源码分析
- STL一级空间配置器
- 【STL】SGI空间配置器(一):一级空间配置器
- 【STL深入学习】SGI STL空间配置器详解(一)-第一级空间配置器
- 【STL】SGI空间配置器 Allocator
- STL空间配置策略之第一级配置器__malloc_alloc_template
- SGI STL源码之内存配置
- STL中空间配置器(allocator)的简单实现
- STL源码:空间配置器(二)构造和析构construct()/destroy()
- STL空间配置器——第一级配置器__malloc_alloc_template剖析
- 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii autoloader] [ 2.0 版本 ]
- STL_7:空间配置器
- 标准模板库的空间配置器 STL's allocator
- STL对空间配置的设计哲学-《STL源码剖析笔记》
- [stl] SGI STL的空间配置器
- SGI STL学习笔记(1):空间配置器(allocator)