STL空間配置

2021-08-05 19:47:54 字數 3332 閱讀 1111

sgi stl有兩級配置器:

以下**為簡單實現:

第一級配置器標頭檔案:malloc_alloc.h

#ifndef malloc_alloc_h

#define malloc_alloc_h

#include

class malloc_alloc

static

void deallocate(void* p, size_t n)

static

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

};#endif

第一級配置器標頭檔案:malloc_alloc.cpp

#include"malloc_alloc.h"

#include

void* malloc_alloc::oom_malloc(size_t n)

std::cout

<< "malloc error!"

<< std::endl;

return0;}

void* malloc_alloc::oom_realloc(void* p, size_t n)

std::cout

<< "realloc error!"

<< std::endl;

return

0;}

第二級配置器標頭檔案:memorypool.h

#ifndef _memorypool_h

#define _memorypool_h

#include

using

namespace

std;

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

enum ; //小型區塊的上限

enum ; //freelists個數

//記憶體池

class alloc;

private:

//16個freelists

static obj* volatile free_list[numfreelists];

//以下函式根據區塊的大小,決定使用第n號free_list,n從0開始

static size_t freelist_index(size_t bytes)

//將bytes上調至8的倍數

static size_t round_up(size_t bytes)

//返回乙個大小為n的物件,並可能加入大小為n的其他區塊到free_list

static

void* refill(size_t n);

//配置一大塊區間,可容納nobjs個大小為size的區塊,如果修飾nobjs個區塊無法滿足,

//nobjs可能會降低

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); //重新分配記憶體

};#endif

第二級配置器標頭檔案:alloc.cpp

#include"malloc_alloc.h"

#include"memorypool.h"

//static成員的初值設定

char* alloc::start_free = null;

char* alloc::end_free = null;

size_t alloc::heap_size = 0;

alloc::obj* volatile alloc::free_list[numfreelists] = ;

//分配記憶體

void* alloc::allocate(size_t n)

//調整free_list

*my_free_list = result->free_list_link;

return result;

}//釋放記憶體

void alloc::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;

}//返回乙個大小為n的物件,並且有時候會為適當的free_list增加節點,假設n已經適當上調至8的倍數

void* alloc::refill(size_t n)

else

}return result;

}//記憶體池配置記憶體

//呼叫chunk_alloc(),嘗試取得nobjs個區塊作為free_list的新節點

//注意引數nobjs是pass by reference

char* alloc::chunk_alloc(size_t size, int& nobjs)

else

if (bytes_left >= size)

else

//配置heap空間,用來補充記憶體池

start_free = (char*)malloc(bytes_to_get);

if (start_free == 0)

}end_free = 0;

start_free = (char*)malloc_alloc::allocate(bytes_to_get);

}heap_size += bytes_to_get;

end_free = start_free + bytes_to_get;

//遞迴呼叫自己,為了修正nobjs

return (chunk_alloc(size, nobjs));

}}

測試檔案:main.cpp

#include"memorypool.h"

#include

int main()

STL 空間配置器

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

STL 空間配置器

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

STL空間配置器

一級空間配置器 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...