《STL源码剖析》STL空间配置器

空间配置器主要是申请内存空间和释放内存空间。

配置器中会维护16个自由链表——“free_lis”,各自维护的内存空间节点的大小分别从8bytes到128bytes。每次都是使用一个节点或者释放一个节点。如果空间大于128bytes则直接使用malloc和alloc 向(往)系统堆栈上申请(释放)内存空间,而不是由配置器维护。而每次申请和释放都会是,不断地切换节点指向。如下面申请内存空间的代码 和 释放内存空间的代码:


 static void * allocate(size_t n)
  {
    obj * __VOLATILE * my_free_list;
    obj * __RESTRICT result;

    if (n > (size_t) __MAX_BYTES) {
        return(malloc_alloc::allocate(n));
    }
	//找到由那个链表取一个节点的空间使用
    my_free_list = free_list + FREELIST_INDEX(n);
	
    result = *my_free_list;
    if (result == 0) {
        void *r = refill(ROUND_UP(n));
        return r;
    }
	
    *my_free_list = result -> free_list_link;
	//返回获得的空间地址
    return (result);
  };
//释放内存空间
 static void deallocate(void *p, size_t n)
  {
    obj *q = (obj *)p;
    obj * __VOLATILE * my_free_list;

    if (n > (size_t) __MAX_BYTES) {
        malloc_alloc::deallocate(p, n);
        return;
    }
	//查找节点
    my_free_list = free_list + FREELIST_INDEX(n);

	//收回一个节点的内存空间,放入链表待用
    q -> free_list_link = *my_free_list;
    *my_free_list = q;
  }



你可能感兴趣的:(《STL源码剖析》STL空间配置器)