C 11 使用可變引數模板類實現物件池

2021-10-05 15:27:34 字數 3038 閱讀 6312

物件池模板類:

#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介紹一種通過...