STL空間配置器

2021-08-03 13:38:06 字數 3218 閱讀 9713

一級空間配置器

#ifndef _malloc_alloc_template_h

#define _malloc_alloc_template_h

#if 0

#include#define __throw_bad_alloc throw bad_alloc

#elif !defined(_throw_bad_alloc)

#includeusing namespace std;

#define __throw_bad_alloc cerr<<" of memory"static void deallocate(void *p,size_t)

static void *reallocate(void *p,size_t old_sz,size_t new_sz )

static void(* set_malloc_oom_handler(void (*f) ()))()//它怎麼分析? };

templatevoid(* __malloc_alloc_template::__malloc_alloc_oom_handler)()=0;

templatevoid * __malloc_alloc_template::oom_malloc(size_t n)

(*my_malloc_handler)();

if(result) return(result); }}

templatevoid * __malloc_alloc_template::oom_realloc(void *p,size_t n)

(* my_malloc_handler)();

result = realloc(p,n);

if(result)return(result); }}

#endif

二級配置器

#ifndef _default_alloc_template_h

#define _default_alloc_template_h

enum;//小型區塊的上調邊界

enum;//小型區塊的上限

enum;//free_list的個數;

templateclass _default_alloc_template

private:

union obj;

private:

static obj* volatile free_list[_nfreelists];//陣列裡面存放的是obj型別的指標;

//以下函式根據區塊大小,決定使用第n號freelist,從0算起;

static size_t freelist_index(size_t bytes)

static void *refill(size_t n);

static char *chunk_alloc(size_t size,int &nobjs);

static char *start_free;

static char *end_free;

static size_t heap_size;

public:

static void* allocate(size_t n);

static void deallocate(void *p,size_t n);

static void *reallocate(void *p,size_t old_sz,size_t new_sz);

};template char *_default_alloc_template::start_free =0;

templatechar *_default_alloc_template::end_free=0;

templatesize_t _default_alloc_template::heap_size=0;

templatetypename _default_alloc_template::obj* volatile _default_alloc_template::free_list[_nfreelists]=;

templatevoid *_default_alloc_template::allocate(size_t n)

my_free_list = free_list+freelist_index(n);

result =*my_free_list;

if(result == 0)

*my_free_list = result->free_list_link;

return (result);

}templatevoid _default_alloc_template::deallocate(void *p,size_t n)

my_free_list = free_list +freelist_index(n);

q->free_list_link = *my_free_list;

*my_free_list =q;

}templatevoid* _default_alloc_template::refill(size_t n)

else

}}templatechar *_default_alloc_template::chunk_alloc(size_t size,int &nobjs)

else if(bytes_left >=size)//記憶體池記憶體不夠nobjs*size,但是夠乙個以上的區塊/;

else//記憶體池中的記憶體連一塊都不夠了

start_free=(char*)malloc(bytes_to_get);//它在這裡開闢空間了,後面卻沒有釋放記憶體?它是如何釋放記憶體的?

if(0 == start_free)

}end_free = 0;//如果出現意外,呼叫第一級配置器,看看out_of_memory;

start_free = (char *)__malloc_alloc_template<0>::alloc(bytes_to_get);

} heap_size += bytes_to_get;

end_free = start_free+bytes_to_get;

return (chunk_alloc(size,nobjs));

}}#endif

主函式#if 1

#include"__malloc_alloc_template.h"

#include"__default_alloc_template.h"

#includeusing namespace std;

int main()

#endif

STL 空間配置器

stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...

STL 空間配置器

stl空間配置器的底層原理 維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。源 pragma once using namespace std define throw bad alloc cerr out of memory endl ex...

STL 空間配置器

stl的記憶體分配和釋放被詳細區分為四個部分 記憶體配置由allocate 負責 內部實現為operator new 記憶體釋放由deallocate 負責 內部實現為operator delete 物件構造由construct 負責 內部實現為placement new 物件析構操作由destro...