決定還是兩個都看,原來那個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開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...