STL Allocate學習筆記

2021-10-20 20:20:51 字數 3774 閱讀 3424

決定還是兩個都看,原來那個tinystl只注釋,新的手打。

allocate的設計,我只能說,是精妙到姥姥家了,太精妙了!

但是也太難了…………

allocator.h

#ifndef _allocator_h_

#define _allocator_h_

#include

"alloc.h"

#include

"construct.h"

#include

#include

namespace tinystl

;template

<

class

t>

t *allocator

::allocate()

template

<

class

t>

t *allocator

::allocate

(size_t n)

template

<

class

t>

void allocator

::deallocate

(t *ptr)

template

<

class

t>

void allocator

::deallocate

(t *ptr, size_t n)

template

<

class

t>

void allocator

::construct

(t *ptr)

template

<

class

t>

void allocator

::construct

(t *ptr,

const t& value)

template

<

class

t>

void allocator

::destroy

(t *ptr)

template

<

class

t>

void allocator

::destroy

(t *first, t *last)}}

#endif

alloc.h

#ifndef _alloc_h_

#define _alloc_h_

#include

namespace tinystl

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

enum emaxbytes

;//小型區塊的上限,超過的區塊由malloc分配

enum enfreelists

;//free-lists的個數

enum enobjs

;//每次增加的節點數

private

://free-lists的節點構,使用union構造,節省記憶體,柔性陣列

union obj

;static obj *free_list[enfreelists::nfreelists]

;private

://靜態變數初始化一次

static

char

*start_free;

//記憶體池起始位置

static

char

*end_free;

//記憶體池結束位置

static size_t heap_size;

//堆區大小

private

://位運算求2^n次方的倍數

static size_t round_up

(size_t bytes)

//根據區塊大小,決定使用第n號free-list,n從0開始計算

static size_t freelist_index

(size_t bytes)

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

static

void

*refill

(size_t n)

;//配置一大塊空間,可容納nobjs個大小為size的區塊

//如果配置nobjs個區塊有所不便,nobjs可能會降低

static

char

*chunk_alloc

(size_t size, size_t& nobjs)

;public

:static

void

*allocate

(size_t bytes)

;static

void

deallocate

(void

*ptr, size_t bytes)

;static

void

*reallocate

(void

*ptr, size_t old_sz, size_t new_sz);}

;}#endif

alloc.cpp

#include

"../alloc.h"

namespace tinystl

;//成員函式

void

*alloc::

allocate

(size_t bytes)

size_t index =

freelist_index

(bytes)

;//計算索引號

obj *list = free_list[index];if

(list)

else

}void alloc::

deallocate

(void

*ptr, size_t bytes)

else

}void

*alloc::

reallocate

(void

*ptr, size_t old_sz, size_t new_sz)

//返回乙個大小為n的物件,並且有時候會為適當的free list增加節點

//假設bytes已經上調為8的倍數

void

*alloc::

refill

(size_t bytes)

else

else

}return result;}}

//假設bytes已經上調為8的倍數

char

*alloc::

chunk_alloc

(size_t bytes, size_t& nobjs)

else

if(bytes_left >= bytes)

else

start_free =

(char*)

malloc

(bytes_to_get)

;//需要的空間if(

!start_free)

} end_free =0;

//這似乎應該再去呼叫一次一級介面卡

} heap_size +

= bytes_to_get;

end_free = start_free + bytes_to_get;

return

chunk_alloc

(bytes, nobjs)

;//遞迴呼叫自己,修正資料}}

}

學習筆記 雜湊學習筆記

hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...

學習筆記 CentOS 學習筆記01

簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...

筆記 spring cloud 學習筆記

1 spring cloud 是什麼 spring cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具 例如配置管理,服務發現,斷路器,智慧型路由,微 控制匯流排 分布式系統的協調導致了樣板模式,使用spring cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...