LOGIN • JOININ

MEMORY BLOCK POOL

[Tutorials/[Common] 1. Object System/Tutorial_Object03_MemoryBlockPool]



메모리 블록의 경우 객체풀과 다르게 NCGPoolable과 같은 인터페이스 클래스를 상속받을 수가 없습니다.

그래서 메모리 역시 특정 크기의 메모리 단위로 객체화하여 객체 풀로 동작하도록 합니다.  즉 엄밀히 말해 CGCII의 메모리풀은 힙할당기는 아닙니다.

메모리풀은 CGD::buffer를 상속받은 CCGBuffer를 사용하시길 권합니다.



1... Memory Block Pool로 메모리 할당하기

CCGBuffer은 한마디로 CGD::buffer와 CGPTR의 기능 가지를 갖춘 메모리 버퍼 시스템입니다.

따라서 CGD::buffer의 기능을 활용해 손쉽게 메모리를 억세스할 수 있고 

할당받은 메모리 객체에 대해 CGPTR를 사용하기 참조계수에 의해 자동적으로 가비지콜렉션 됩니다.

{
	// 100 byte를 동적 할당한다.
	CCGBuffer	tempBuffer	 = MEM_POOL_ALLOC(100);

}

메모리 풀에서 메모리를 할당받기 위해서는 아래와 같이 'MEM_POOL_ALLOC(SIZE)'를 사용하면 됩니다. 

MEM_POOL_ALLOC(100)은 100Byte의 메모리의 할당을 요청하는 것이며 메모리가 할당되면 CCGBuffer에 값을 넣습니다.

이때 CCGBuffer의 buf에는 할당받은 메모리 주소가 들어가며 len은 0으로 초기화됩니다.

CCGBuffer는 자체적으로 스마트포인터 기능을 가지고 있으므로 위의 예제에서는 블록이 종료되면 할당받은 자동으로  할당해제됩니다.된다.

할당받은 메모리는 CGD::buffer의 기능을 사용하여 편리하게 사용할 수 있습니다.



[Tutorial_Object_MemoryBlockPool.cpp]
#include "stdafx.h"

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
	// ------------------------------------------------------------------
	// 1. 풀을 사용하지 않고 CCGBuffer에 메모리 동적 할당하기
	//    - MEM_ALLOC() 매크로를 사용하여 동적할당할 수 있다.
	// ------------------------------------------------------------------
	{
		// 1) 100 byte를 malloc()를 사용하여 동적할당한다.
		CCGBuffer	tempBuffer1	 = MEM_ALLOC(100);

		// 2) 생성자의 파라메터 형식으로 할당할 수도 있다.
		CCGBuffer	tempBuffer2(MEM_ALLOC(100));

		// 3) 사용하려면 tempBuffer를 각종 함수를 사용하여 쓸수 있다.
		tempBuffer1.buf;
		tempBuffer1.len;

		// X) 이 Block이 끝나면 CCGBuffer가 소멸되며 할당된 메모리는 자동적으로 할당 해제된다.
	}


	// ------------------------------------------------------------------
	// 2. Memory Block Pool
	//    - Memory Block Pool을 사용하여 메모리를 할당받을 수 있다.
	//    - Memory Block Pool을 사용하면 많은 성능 향상을 얻을 수 있다.
	//    - MEM_ALLOC()대신 MEM_POOL_ALLOC()를 사용하면 된다.
	// ------------------------------------------------------------------
	{
		// 1) 100 byte를 malloc()를 사용하여 동적할당한다.
		CCGBuffer	tempBuffer	 = MEM_POOL_ALLOC(100);

		// 2) 생성자의 파라메터 형식으로 할당할 수도 있다.
		CCGBuffer	tempBuffer2(MEM_POOL_ALLOC(100));

		// 3) 사용하려면 tempBuffer를 각종 함수를 사용하여 쓸수 있다.
		tempBuffer.buf;
		tempBuffer.len;

		// X) 이 Block이 끝나면 CCGBuffer가 소멸되며 할당된 메모리를 자동적으로 Memory Block Pool로 되돌려 준다.
	}


	// ------------------------------------------------------------------
	// 3. 뒷마무리 & 끝내기
	// ------------------------------------------------------------------
	// 1) Esc를 누를 때까지 기다린다.
	while(_getch()!=27);


	// Return) 끝.
	return 0;
}