#pragma once
#include <list>
class Simpool
{
public:
void* alloc()
{
if(this->freeList.begin() == this->freeList.end())
{
return (void*)(new char[this->AllocSize]);
}
else
{
this->freeListIter = this->freeList.begin();
void* ret = *(this->freeListIter);
this->freeList.erase(this->freeListIter);
return ret;
}
}
void free(void* mem)
{
this->freeList.push_back(mem);
}
Simpool(int sz)
{
this->AllocSize = sz;
}
Simpool(int sz, int cnt)
{
this->AllocSize = sz;
char* tmp = new char[sz*cnt];
for(int i = 0; i < cnt; i++)
{
this->freeList.push_back(tmp+(i*sz));
}
}
private:
int AllocSize;
std::list<void*> freeList;
std::list<void*>::iterator freeListIter;
};
그냥 생각나는데로 간단하게 만들어봤음...
자주 할당 / 해제 되는 특정 구조체 메모리 풀링 관리 해주는건데..
Simpool Test = new Simpool(sizeof(STRUCT));
이렇게 할당해서 Test.alloc() 하면 할당되고 Test.free(pointer) 하면 할당해제됨
할당 해제 할때 클래스에서 만들어둔 리스트에 보관을 하고... 이후에 alloc 하면 전에 할당해둔걸 그대로 반환하도록 했거든?
따로 뭐 체크한다거나... 그런거 하면 속도도 약간 느려질거고 만든 의미가 없어지는거 가틈
저런 메모리풀 어떰 ?
걍 간단하게 돌아가는것만 확인했는데 소스검증이나 이런건 어떻게 체크해보면 될가... 내가 보기엔 아직 문제업는 소스코드 같은데
흉... 진심으로 하는 소린데... 그렇게 pool 구현할 생각이면 차라리 그냥 malloc 써.
그냥 몇몇 구조체만 저런식으로 간단하게 해서 쓰면 갠찬치 안음?? 별루임;;?
저렇게 stl과 override 안한 생짜 new 써서 pool 구현하는 경우를 종종 보거든... 근데 저런걸 왜 만들어? 차라리 HeapCreate() 로 heap 생성해서 똑같은 크기의 블럭만 계속 할당하는게 훨 효율적인데..
일단은... 저기 저 new 연산자가 어디서 어떻게 할당받는지에 대해서부터 알아야겠지? new 는 오버라이드 안하면 malloc 호출하고, malloc는 Process heap 에서 할당해버림. process heap 은 대량의 버퍼 pool을 할당하라고 만들어진 물건이 아니라서.. 게다가 stl 을 쓰는데... 저 stl 도 allocator 따로 안만들면 역시 malloc 사용하는거 알긴 아심? 삽입연산이 코드상으론 단순하지만 실제론 수도 없이 malloc/free를 호출해서 임시노드를 할당하고 반납한다...
아 그러네... 생각해보니 리스트에 삽입할때도 malloc 가 쓰이는구나... 그걸 생각 못했어.........
게다가 저건 thread-safe 하지도 않으니 대략... 그냥 malloc 쓰면 차라리 process heap 에 뮤텍스라도 있으니 thread-safe 하기라도 하지... 일단 lock-free 자료구조와 virtual address space 를 다룰 능력 없으면... HeapCreate()/HeapAlloc() 쓰는게 훨 효율적임.
고맙습니당 많은 도움이 되었어요! 다시 공부해야겠네요
뭐 암튼 서버 프레임워크, 미들웨어 개발하거나, 런타임이 조낸 길고 조또 많은 갯수의 데이터를 반복적으로 존내 빨리 처리할 어플 개발할 일이 없는 이상은... 솔까말 뭐 그닥 pool 만들 필요성이...
\'조또 많은 갯수의 데이터를 반복적으로 존내 빨리 처리할 어플 개발할 일이 없는 이상\' 이거 때문인데 제가 이상하게 구현하는것보다는 그냥 있는거 갓다 쓰는게 훨신 효율적이라고 깨닫게됬습니다.. 허허
훔... 조또 많은 갯수의 데이터를 반복적으로 존내 빨리 처리할 어플 개발할 일이 있는데, 간단하게 pool 비스무리 구현하고 싶다면... 그냥 HeapCreate() 로 적당한 크기의 heap 만들어서 무조건 일정한 크기로 HeapAlloc() 하는게 가장 효율적임.
따로 override 안한 new 연산자나 기본 allocator 쓰는 stl 등등은 죄다 malloc() 쓰고 얘들은 process heap 쓰는데, 이게 초기 1MB 에 growable 이거든. 근데 process heap 은 api 호출시 사용되는 임시 버퍼 할당용으로 만든거라서 마구 단편화시키면 런타임 긴 어플에선 골아파지는 경우가 있음.
아... HeapCreate / HeapAlloc 쓰는게 가장 알맞겠네요. 고맙습니다