物件池模板類:
#pragma once
#include
"cobjinstance.h"
#include
#include
#include
///
/// 實現模板型別物件池,使其可以適配任何類型別且是執行緒安全的!!!
///
template
<
class
t>
class
cobjpool
~cobjpool()
//再釋放node的記憶體
delete
m_poolmemoryheader;
m_poolmemoryheader =
nullptr;}
}///
/// 每個物件的頭節點
///
struct headnode
;///
/// 獲取物件池的物件數
///
///
intgetpoolsetobjcount()
///
//初始化物件池
///
template
<
typename..
. args>
void
initobjpool
(int nobjcount, args.
.. args)
//初始化使用記憶體
size_t nusememorysize = nobjcount *
(sizeof
(headnode));
//一次性分配記憶體池物件需要使用的總記憶體(物件自己的記憶體除外)
m_poolmemoryheader =
newchar
[nusememorysize]
;memset
(m_poolmemoryheader,
0, nusememorysize *
sizeof
(char))
;//初始化跟節點
char
* tempmemoryheader = m_poolmemoryheader;
m_prootnode =
initheadnode
(tempmemoryheader)
; tempmemoryheader = tempmemoryheader +
(sizeof
(headnode));
m_prootnode-
>nid =1;
m_prootnode-
>pobjinstance =
(char*)
(new
t(args...
));//tempmemoryheader += sizeof(t);
m_mapfreenode[m_prootnode-
>nid]
= m_prootnode;
//初始化其它節點
headnode* tempnode = m_prootnode;
for(
int i =
1; i < nobjcount; i++
) m_poolobjcount = nobjcount;
}//獲取使用物件
t*newobjinstance()
headnode* node =
(*m_mapfreenode.
begin()
).second;
obj =
(t*)
(node-
>pobjinstance)
; node-
>nrefcount++
; m_mapfreenode.
erase
(m_mapfreenode.
begin()
);return obj;
}//釋放使用物件
void
deleteobjinstance
(void
* p)
node = node-
>pnext;}if
(node ==
nullptr
) node-
>nrefcount--;if
(node-
>nrefcount ==0)
}private
://初始化headnode
headnode*
initheadnode
(char
* p)
private
:int m_poolobjcount =0;
//物件池中的物件總數
char
* m_poolmemoryheader =
nullptr
;//物件池記憶體起始位址
headnode* m_prootnode =
nullptr
;//物件池根節點
std::map
> m_mapfreenode;
//空閒obj節點 key:節點id value: 節點指標
std::mutex m_mutex;
//申請obj鎖
};
測試**:
```cpp
#include #include "cobjpool.h"
class a
~a()
public:
int a = 0;
};class b
~b()
public:
int a = 0;
int b = 0;
};void test()
int main()
測試結果:
c 11 可變引數模板類
可變引數模板類,如元組 template class tuple 遞迴和特化的方式展開引數包 可變引數模板類前向宣告 template struct sum 定義展開引數的可變引數模板類 template struct sum 可變引數模板類的特化,遞迴的終止類 template struct su...
C 11可變引數函式模板
在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 include include using namespace std class logger static void makeloggeroff static bool loggerstate t...
c 11 之可變引數模板
目的 包含0到任意個模板引數 宣告可變引數模板需要在typename或class 後面加上省略號 一 可變引數模板函式 template void f t.args cout 可變引數展開有兩種方式 1.通過遞迴的模板函式來將引數展開 2.通過逗號表示式和初始化列表方式展開引數包 對於1介紹一種通過...