이 라이브러리는 C++로 작성된 정적 타입, 동적 크기 메모리 풀 시스템을 구현합니다. 메모리 재사용을 통해 할당과 해제를 최적화하여 성능을 향상시키며, 효율적인 메모리 관리를 제공합니다. 모든 메모리 풀의 생성(create), 할당(alloc), 해제(dealloc)은 CMemoryPoolManager를 통해서 수행할 수 있습니다.
할당(alloc)의 경우, 이 프로젝트는 수동 메모리 관리 방식과 직접 구현한 CSharedPtr를 이용한 자동 메모리 관리 방식 두 가지를 제공합니다.
메모리 풀의 크기는 동적으로 조정됩니다. 초기 크기는 CMemoryPoolManager를 통해 CStaticMemoryPool<T>의 생성자에서 설정할 수 있습니다. 풀은 필요할 때마다 초기 크기만큼 새로운 메모리 블록을 할당하고, 사용 가능한 블록의 인덱스를 mFreeIdx 스택에 추가합니다.
mFreeIdx 스택에서는 사용 가능한 블록의 인덱스를 관리하여, 가장 최근에 해제되었거나 가장 앞에 있는 블록이 우선적으로 할당됩니다. 포인터가 가리키는 대상은 placement new를 사용해 할당된 메모리 블록에서 생성자를 호출해 객체를 생성함으로써 올바르게 초기화하고 가상 함수도 지원합니다. 사용 가능한 블록이 없으면 ExpandPool()을 호출합니다.
이 함수는 메모리를 해제하고 포인터를 풀에 반환하여 재사용할 수 있도록 합니다. 해제 후, 풀이 더 이상 사용되지 않더라도 해당 풀은 유지됩니다.
코드 분석
사용 예제 #1 - (수동 메모리 관리 방식)
int main(){ // Player 타입을 위한 크기 100의 메모리 풀 생성 CMemoryPoolManager::GetInst()->CreatePool<Player>(100); // Player 타입의 메모리 풀에서 사용 가능한 메모리 블록의 포인터를 반환 Player* ptr = CMemoryPoolManager::GetInst()->Allocate<Player>(); // 사용한 포인터를 메모리 풀로 반환하여 재사용 // 해제 후, 풀이 더 이상 사용되지 않으면 삭제 CMemoryPoolManager::GetInst()->Deallocate(ptr); // 또는, 해제 후에 더 이상 사용되지 않더라도 풀이 삭제되지 않도록 할 때 사용 CMemoryPoolManager::GetInst()->DeallocateButKeepPool(ptr); // Player 타입의 메모리 풀 삭제 CMemoryPoolManager::GetInst()->DeletePool<Player>(); // 메모리 풀 매니저 객체 삭제 CMemoryPoolManager::DestroyInst(); return 0;}
Player 타입의 메모리 풀에서 CMemoryPoolManager를 사용한 수동 메모리 관리 사용 예제입니다.
사용 예제 #2 - (자동 메모리 관리 방식)
// CSharedPtr를 사용하려는 클래스 객체는 반드시 CRefCounter를 상속 필수int main(){ // Player 타입을 위한 크기 100의 메모리 풀 생성 CMemoryPoolManager::GetInst()->CreatePool<Player>(100); // Player 타입의 메모리 풀에서 사용 가능한 메모리 블록의 포인터를 반환 Player* playerPtr = CMemoryPoolManager::GetInst()->Allocate<Player>(); CSharedPtr<Player> ptr1 = playerPtr; // 참조 카운트: 1 CSharedPtr<Player> ptr2 = playerPtr; // 참조 카운트: 2 ptr1 = nullptr; // refCount: 1 // 자동으로 메모리 관리 및 메모리 풀에 메모리 반환 ptr2 = nullptr; // refCount: 0 // 메모리 풀 매니저 객체 삭제 CMemoryPoolManager::DestroyInst(); return 0;}
Player 타입의 메모리 풀에서 참조 카운트를 사용하는 CSharedPtr를 활용한 자동 메모리 관리 사용 예제입니다.