void **
void** array;
int arrayLen = 10;
array = (void**)malloc(arrayLen * sizeof(void*));
some_type_t* some_object_ptr;
// The following two assignment are equivalent since in C,
// array[index] <=> *(array + index)
array[index] = (void*)some_object_ptr;
*(array + index) = (void*)some_object_ptr;
void *
可以指向任何數(shù)據(jù)結(jié)構(gòu)的指針
stackoverflow void **
mem 統(tǒng)計(jì)直方圖 直方圖的實(shí)現(xiàn)
mem 分配中惧笛,統(tǒng)計(jì)直方圖的實(shí)現(xiàn)mem2.c
中
static void adjustStats(int iSize, int increment){# icrement的值為正或者負(fù)
int i = ROUND8(iSize)/8;//以8為間隔
if( i>NCSIZE-1 ){//大于800byte的統(tǒng)一歸在一個(gè)圖中
i = NCSIZE - 1;
}
if( increment>0 ){
mem.nAlloc[i]++;
mem.nCurrent[i]++;
if( mem.nCurrent[i]>mem.mxCurrent[i] ){
mem.mxCurrent[i] = mem.nCurrent[i];
}
}else{//釋放就減小
mem.nCurrent[i]--;
assert( mem.nCurrent[i]>=0 );
}
}
mem結(jié)果中有一些結(jié)構(gòu)如下
...
int nAlloc[NCSIZE]; /* Total number of allocations */
int nCurrent[NCSIZE]; /* Current number of allocations */
int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */
...
對(duì)8向上取倍數(shù)#define ROUND8(x) (((x)+7)&~7)
向下取倍數(shù)#define ROUNDDOWN8(x) ((x)&~7)
為了讓代碼更有語意脐供。需要對(duì)代碼進(jìn)行包裝例如下面的代碼,也是解耦的一種做法
/*
** Round up a request size to the next valid allocation size.
*/
static int sqlite3MemRoundup(int n){
return ROUND8(n);
}
Scratch memory
用來進(jìn)行例如btree整理的時(shí)候阅悍,用的臨時(shí)內(nèi)存
look aside allocator
slite 常常會(huì)分配一些很小的內(nèi)存來存放例如the names of tables and columns, parse tree nodes, individual query results values, and B-Tree cursor objects.
等等,利用系統(tǒng)的malloc就會(huì)很浪費(fèi)cpu時(shí)間芭毙,所以開發(fā)出了一個(gè)相對(duì)高效的 look aside allocator
mem2.c 內(nèi)存管理
sqlite 內(nèi)存分配管理
- 分配失敗之后的管理挽铁。如果分配內(nèi)存失敗,會(huì)釋放掉祠饺,cache page越驻。在
pcache1AllocPage
函數(shù)中實(shí)現(xiàn) - 沒有內(nèi)存泄露,應(yīng)用程序負(fù)責(zé)銷毀
- 可以設(shè)置內(nèi)存使用限制∽号裕可以重復(fù)利用分配的cache
- zero-malloc option sqlite會(huì)先分配一個(gè)大的bulk memory记劈。然后在里面自己組織內(nèi)存分配
- 程序自定義,內(nèi)存分配程序
- 提供內(nèi)存統(tǒng)計(jì)功能
- sqltie最小化使用系統(tǒng)的malloc free
當(dāng)開啟 debug 模式之后并巍,會(huì)使用 instrumented memory allocator
有特殊的函數(shù)目木,來模擬out of memery
sqlite3_free 必須是之前sqlite3Malloc
或者sqlite3_realloc
函數(shù)返回的指針
sqlite3_realloc(X,N)
重新組織之前分配的內(nèi)存,X是分配內(nèi)存的位置指針懊渡,如果x為空指針刽射,結(jié)果跟 allocatte
下效果一樣.如果N為0就跟 free
的效果一樣
sqlite3Malloc模式
當(dāng)使用bebug模式,會(huì)在系統(tǒng)提供的函數(shù)中剃执,提供wapper 會(huì)額外分配100byte 來防止防止超出邊界的哨兵誓禁。這100個(gè)byte 還會(huì)記錄測(cè)試腳本的名稱,方便測(cè)試
memsys5
選項(xiàng)肾档,使用zero-malloc option 會(huì)事先分配一個(gè)大內(nèi)存自己管理摹恰,通常在嵌入式系統(tǒng)中會(huì)使用
memsys3
類似zero-malloc 只是不提供嚴(yán)格的,memory fragmentation and breakdown
mem3是 mem5的前身 . 建議所有希望zero-config的都應(yīng)該使用mem5而不是使用mem3 mem3很可能在未來從代碼庫中去掉 mem4
和mem6
是實(shí)驗(yàn)性的代碼都被刪除了
默認(rèn)是memsys1
debug模式下是memsys2