Click here to Skip to main content
15,886,518 members
Articles / Mobile Apps
Article

VMemPool - Virtual Memory Pool Management class

Rate me:
Please Sign up or sign in to vote.
4.80/5 (18 votes)
8 Aug 2002CPOL2 min read 154.3K   3.4K   70   34
If you deal with same size objects in server coding, VMemPool shows a good way for beginners.

Image 1

Introduction

As you know, new/delete operations take a lot of CPU time. If you work with servers, CPU time is important. If additional memory is added to the server, then the servers' available memory size will grow in a linear fashion. However CPU's don't behave the same (dual CPU's doesn't necessarily mean twice the speed of a one CPU situation.)
So common server code has it's own efficient memory management system. VMemPool is the one of them for me.

About The Implementation

CVMemPool is generic (template) class since I assumed the client would want a similar usage as new/delete. So, using CVMemPool, you can code like it's a general pointer.

CObj* p = new CObj;

p->do();

delete p;

CVMemPool has it's own 'allocation table' implemented using a circular queue, so you can check if a pointer in a pool is valid using vmIsBadPtr. You can also check how many objects are allocated in the pool using vmGetPoolInfo.

CVMemPool has two template variable, class objT and DWORD _dwPoolSizeT = 1000. _dwPoolSizeT is the size of the pool. You can reconfigure the pool size with this variable. objT should not be important to you. If objT is absent and you have a different class make the object as below.

// suppose CVMemPool is like below. it's not real code.
template <DWORD _dwPoolSizeT = 1000>
class CVMemPool 
{ 
  ... 
};

class CObj1 : public CVMemPool<>
{
 ...
};

class CObj2 : public CVMemPool<>
{
 ...
};

CObj1 c1;
CObj2 c2; // it will share pool with c1 , it is not good. cos i need objT.

As you know, when a compiler sees the last instancing code, the compiler will think c1 and c2 are the same template class layout and so it make only one virtual pool (because CVMemPool<T,F>::ms_pMemPool is static.)

Usage

//make class in pool.
class CObj : public CVMemPool<CObj>
{
 ...
};

// and you can use it same like general new/delete code.
CObj* p = new CObj; // Pool is created, and allocation in first pool block.
CObj* p2 = new CObj; // second pool block will be used.

delete p; // first block will be freed.
delete p2; // second ,too.

Performance

Test environment

P4 1.6GHz, 256MB ram, Windows 2000 Professional, release executable testing.
Two situations tested:
first, CObj is 1,000 bytes size and loop new and delete 10,000 , 20.000 ....
first, CObj is 10,000 bytes size and loop new and delete 10,000 , 20.000 ....
( n * 1,000 is wrong, n* 10,000 is right, sorry ) The Results are below. Image 2 Image 3

I can't say that these results are exactly right, but I think CVMemPool will be better than the default heap operation (new/delete) on the server side, or on the client side for some CPU's.
In the second situation, I tested 6,000 or over, but I couldn't see the result on the 'Heap' because the program gave a fatal error - insufficient memory - surely, CVMemPool works well and fast. :)

I hope it help you. Thanks a lot!

Revision History

14 Aug 2002 - Initial revision

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Korea (Republic of) Korea (Republic of)
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionhow to alloc object array? Pin
apollo.hao10-Nov-11 21:37
apollo.hao10-Nov-11 21:37 
Generalhere is a serious semantic problem about multilayer inheritor [modified] Pin
Harly8-Nov-10 19:05
Harly8-Nov-10 19:05 
General안녕하세요 이곳에서 같은 나라 분이 짠 코드를 보게되니 재미있네요. Pin
Matrix is everywhere24-Aug-10 16:15
Matrix is everywhere24-Aug-10 16:15 
GeneralNext small bug found... [modified] Pin
lefis27-Sep-08 9:53
lefis27-Sep-08 9:53 
Questionmemory problem Pin
Kumara Swamy12-May-07 1:27
Kumara Swamy12-May-07 1:27 
Generalproblem Pin
caishaikedou27-Apr-06 17:35
caishaikedou27-Apr-06 17:35 
GeneralAlign with 4 bytes Pin
AloneInTheCP10-Jan-06 21:13
AloneInTheCP10-Jan-06 21:13 
AnswerRe: Align with 4 bytes Pin
rinzai5-Mar-07 8:34
rinzai5-Mar-07 8:34 
GeneralVS.NET 2003 Pin
profix8987-Feb-05 6:17
profix8987-Feb-05 6:17 
GeneralRe: VS.NET 2003 Pin
rabidusprocella10-May-05 23:33
rabidusprocella10-May-05 23:33 
QuestiontimeGetTime? Pin
madkoala12-Jan-05 19:31
madkoala12-Jan-05 19:31 
AnswerRe: timeGetTime? Pin
Anonymous14-Jan-05 18:47
Anonymous14-Jan-05 18:47 
GeneralBitset Pin
Ronma27-Dec-04 23:04
Ronma27-Dec-04 23:04 
GeneralRe: Bitset Pin
Cho, Kyung-min1-Jan-05 9:09
Cho, Kyung-min1-Jan-05 9:09 
GeneralGreat code. Small bug found, and enhancement suggestion. Pin
prcarp14-Jan-04 5:48
prcarp14-Jan-04 5:48 
GeneralRe: Great code. Small bug found, and enhancement suggestion. Pin
Cho, Kyung-min14-Jan-04 14:27
Cho, Kyung-min14-Jan-04 14:27 
GeneralRe: Great code. Small bug found, and enhancement suggestion. Pin
robosport19-Jul-04 16:52
robosport19-Jul-04 16:52 
GeneralRe: Great code. Small bug found, and enhancement suggestion. Pin
prcarp20-Jul-04 9:05
prcarp20-Jul-04 9:05 
GeneralRe: Great code. Small bug found, and enhancement suggestion. Pin
Harly8-Nov-10 14:34
Harly8-Nov-10 14:34 
GeneralIssues with the design Pin
Victor Boctor19-Nov-02 18:02
Victor Boctor19-Nov-02 18:02 
I like the idea of the class, specially the transparency to the user of the CObj class. However, I have some issues with the design of this class (or the way the article explains how to use the class):

1. The is-a relation for CObj and VMemPool fails, i.e. CObj is not a memory pool. For example, CEmployee is not a VMemPool.

2. The need for inheritance will most probably cause Multiple Inheritance issues, since the CEmployee will have to inherit from CPerson and VMemPool, where CPerson might also have inherited from VMemPool. Assuming that CPerson is not an abstract class.

3. To make use of this memory pool, you will need to change the code of the class being allocated. In some cases this is not desirable. For example, if your class is a container which is allocating 100000 instances of a class that is implemented in a 3rd party library. The design should be flexible enough to allow using this techique for the class under development or for a class that is used by the class under development.

My suggestion is to be able to use the class in this way:

<br />
// A sample where the memory pool is implemented as part of the class.<br />
class CEmployee<br />
{<br />
  // define new / delete to map to m_MemPool new / delete<br />
  // a macro can be defined to automatically do that<br />
  // #define USE_MEM_POOL(class,mempool)<br />
  // in this case USE_MEM_POOL(CEmployee, m_MemPool);<br />
<br />
private:<br />
  static VMemPool<CEmployee> m_MemPool;<br />
}<br />


<br />
// A sample where the memory pool is implemented as part of a collection<br />
// class.<br />
class CMyList<br />
{<br />
  // in this case the list should use m_3rdPartyMemPoolA to new or <br />
  // delete instances of C3rdPartClassA.  In this case it is not<br />
  // as transparent, but it is possible.<br />
<br />
private:<br />
  VMemPool<C3rdPartyClassA> m_3rdPartyMemPoolA;<br />
  VMemPool<C3rdPartyClassB> m_3rdPartyMemPoolB;<br />
}<br />


These are just some thoughts that I wanted to share after reading the article and having a quick look at the code. I have to admit that I didn't get a chance yet to actually use the code. Unsure | :~

http://webnotes.sf.net[^]
GeneralRe: Issues with the design Pin
Tim Smith22-Nov-02 10:15
Tim Smith22-Nov-02 10:15 
GeneralRe: Issues with the design Pin
Cho, Kyung-min16-Dec-02 20:23
Cho, Kyung-min16-Dec-02 20:23 
GeneralNo memory is actually allocated Pin
Tim Smith5-Nov-02 9:24
Tim Smith5-Nov-02 9:24 
GeneralLea Allocator Pin
Tim Smith5-Nov-02 9:38
Tim Smith5-Nov-02 9:38 
GeneralRe: No memory is actually allocated Pin
Cho, Kyung-min16-Dec-02 20:15
Cho, Kyung-min16-Dec-02 20:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.