int a = new int[5];

int b = new int[5];

int c = new int[5];

메모리 상황(■ : 할당된 메모리 □ : 빈 메모리)

a■■■■■   b■■■■■   c■■■■■

 

delete int [] b;

메모리 상황

a■■■■■  □□□□□   c■■■■■

 

int d = new int[10];

a■■■■■   □□□□□   c■■■■■   d■■■■■■■■■■

앞쪽에 빈 메모리가 있지만 10칸 분량의 메모리가 할당되기엔 부족하므로 맨 뒤쪽에 메모리가 할당된다.

 

이런 상황이 반복되면 군데군데 사용할 수 없는 작은 틈이 생깁니다.

나중엔 사용할 수 없는 메모리가 아주 많이 쌓이게 되고 결국 메모리가 남아 있는데도 사용 가능하지 못한 상태가 된다.

 

또한 어떤 게임에서 반지의 제왕처럼 많은 유닛이 살아나고 죽고 할경우 메모리 할당및 해제에 대한 오버헤드가 심하게 된다.

 

이런것의 방법으로 Memory pool 이라는 방법이 있다. 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------

 

풀(Pool)??

- '물 웅덩이'라는 뜻을 가지고 있습니다. 작은 연못을 생각하면 머릿속에서 그려질 겁니다.

흔히 메모리 풀을 많이 들어보게 됩니다.

 

메모리 풀의 원리

- 메모리를 동적으로 생성, 삭제해야 할 경우가 빈번하게 일어납니다.

- 동적 할당은 생성도 생성이지만 삭제할 때 오버 헤드(Overhead)가 상당하다고 합니다.

- 이 오버헤드를 줄이기 위해 메모리 풀을 사용합니다.

 

- 논리적인 이야기입니다. 메모리 풀에 미리 일정한 수의 메모리를 생성해둡니다.

- 필요할 때 메모리풀에서 생성해둔 메모리를 사용하며, 필요하지 않을 때 메모리를 삭제하는 것이 아니라, 메모리 풀에 반납합니다.

- 다시 메모리가 필요할 때 메모리 풀에서 메모리를 가져다 사용합니다.

- 이렇게 반복되면 메모리 생성, 삭제의 오버헤드가 없어지겠죠.

비유하자면 렌탈 서비스라고 할 수 있을까요?

%B8%F0~1.JPG

 

MemoryPool< Object* > mMemoryPool;

mMemoryPool . AddMemory(new Object() , 200);

Object을 200개를 복사 메모리풀에 저장.

GetMemory(); 이건 스택방식으로 하나하나 가져오게 하면 될것같구요.

가지고 오면서 Lock 이란걸 해주면 좋겠네요 혹시나 사용하고 있는것을 가지고 올 수도 있으니깐요.

ReturnMemory(); 사용한 메모리에서 락을 해제 해주면 될것 같은데 Object를 넘긴다고 MemoryPool의 Container에 몇번째 인지 모르니 몇번째에서

가지고 왔는지 확인할 방법을 생각해야할것 같아요.

만드는 방식에는 여러가지가 있겠지만.............. 그리고 메모리풀에서 Object를 가져가 사용하긴 했는데 Object의 상태가 변형이 됐다면?

Object의 원본 상태를 저장한 뭔가가 필요할것 같아요. 디자인패턴의 Prototype을 사용하는것도 좋을것 같군요.

 

 

 

http://blog.naver.com/dovcat/70926068

출처: http://wearekorean.co.kr/zbxe/dic/34455