STL空间配置器

       STL容器可以保存任何C++语言支持的基本类型、用户自定义类型的对象。容器本身只是实现了一种数据结构,对用户数据进行管理。用户数据最终都是保存在内存中的,那么内存的申请、释放工作是由“空间配置器”承担的。标准c++中都提供了std::allocator类。

     当容器中保存的是用户自定义类型数据时,有的数据类型结构简单,占用的空间小;而有的数据类型结构复杂,需要的内存空间大。有的应用程序,需要频繁的进行数据元素的插入、删除操作,这就对应这频繁的内存空间的申请、释放工作。大家都知道频繁的内存操作,会产生严重的性能问题。为了解决这些问题,stlport提供了两个空间配置器。一个是“简单空间配置器”,只是对c运行时库中malloc/free函数进行了简单的封装,唯一不同的是,提供类似new异常处理机制。另一个是“基于内存池的空间配置器”,容器每次申请内存的时候,空间配置器会基于一定的策略,向os申请交大的内存,避免每次内存申请都向os申请。

 

 

     这篇文章,只是介绍“简单空间配置器”。简单空间配置器,只是对 malloc/free进行简单的封装。在内存分配的时候,有可能内存耗尽,而申请失败。所以向用户提供了一个异常处理程序的注册例程,具体实现如下:

 

  typedef void (*oom_malloc_handler)();

  static oom_malloc_handler set_oom_malloc_handler(oom_malloc_handler handler)
 {
      oom_malloc_handler old = _oom_malloc_handler;
      _oom_malloc_handler = handler;
      return old;
 }

 

如果申请内存失败了,那我们就会不停的调用  _oom_malloc_handler ,期盼着通过调用 _oom_malloc_handler ,会得到一部分内存,然后在重新分配,直到分配到内存、或者用户将 _oom_malloc_handler 设置为0为之。具体实现如下:

 

 static void* allocate(size_t size) { void* pResult = malloc(size); if ( !pResult ) { for ( ; ; ) { /** * 如果用户没有提供内存分配异常处理程序,那么直接结束进程。 */ if ( !_oom_malloc_handler ) { exit(1); } //调用异常处理程序,然后重新分配内存。其实这里是渴望用户能释放内存。 _oom_malloc_handler(); pResult = malloc(size); if (pResult) { return pResult; } } } return pResult; }

 

      用户在编写异常处理程序时,应该通过一定机制,使得_oom_malloc_handler 可以为0,否则程序就无限期的执行下去了。

 

 

程序完整的代码:

文件名称:

//bbg_simple_alloc.h

#ifndef _BBG_SIMPLE_ALLOC_H_ #define _BBG_SIMPLE_ALLOC_H_ #include "../bbg_common/bbg_common.h" #include <cstdlib> BEGIN_BBG class simple_alloc { public: typedef void (*oom_malloc_handler)(); public: static void* allocate(size_t size) { void* pResult = malloc(size); if ( !pResult ) { for ( ; ; ) { /** * 如果用户没有提供内存分配异常处理程序,那么直接结束进程。 */ if ( !_oom_malloc_handler ) { exit(1); } //调用异常处理程序,然后重新分配内存。其实这里是渴望用户能释放内存。 _oom_malloc_handler(); pResult = malloc(size); if (pResult) { return pResult; } } } return pResult; } static void deallocate(void* p , size_t n) { BBG_UNUSED(n); free(p); } static oom_malloc_handler set_oom_malloc_handler(oom_malloc_handler handler) { oom_malloc_handler old = _oom_malloc_handler; _oom_malloc_handler = handler; return old; } private: simple_alloc(); ~simple_alloc(); private: static oom_malloc_handler _oom_malloc_handler; }; simple_alloc::oom_malloc_handler simple_alloc::_oom_malloc_handler = 0; END_BBG #endif//_BBG_SIMPLE_ALLOC_H_

你可能感兴趣的:(数据结构,c,工作,OS,语言)