2010-12-28 3 views
1

그래서 풀링해야하는 클래스에 최소한의 수정 만하면 C++ 개체를 쉽게 메모리 풀로 사용할 수 있습니다.서브 클래 싱하여 C++ 메모리 풀링

메모리 풀 자체는 어디서든 찾을 수있는 표준 다양한이지만, 나는이 수업을했습니다 :

Poolable::Poolable(MemPool& lepool){ 
    mempool = &lepool; 
    } 

    Poolable::~Poolable(){ 
    mempool->returnMemory((char*)this); 
    } 

    void * Poolable::operator new(size_t size, MemPool& lepool){ 
    if(!lepool.initialised()) 
     lepool.initializeBasedOnSize(size); 

    return lepool.getMemory(size); 

    } 

    void Poolable::operator delete(void * p){ 
    // do absolutely NOTHING 
    } 

사용 :

class SomeSubclass : public Poolable { /* boring details here */ }; 
    MemPool thepool(1000); 
    SomeSubclass * woot = new(thepool) SomeSubclass(thepool); 

내가 returnMemory의 통화를 보류하고 싶어 (이 기본적으로 delete 연산자에서 풀의 일부를 해제하지만 void * 인자에서 실제 풀 주소를 가져 오는 방법을 알지 못합니다.

대신 소멸자에 넣어서 해결했습니다. 나는 생성자가 클래스가 풀을 사용하여 할당되었다는 것을 명령하고, 이는 파기가 항상 할당 해제를 의미 함을 의미합니다.

첫 번째로 유용한 해결책이며 사용하는 것이 매우 편리합니다. 그러나, 그 일을 아마도 나쁜 스타일이며, 문제에 대한 더 나은 해결책이 있다면 나는 궁금해.

아무도 알고 있나요?

+1

현대 C++ 디자인 읽기 : http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 –

답변

3

대신 에서 Poolable::operator new 메모리를 할당하여 평소 (비 배치) new 문을 사용할 수 있습니다. 솔루션에서 사용자는 이러한 객체가 너무 많은 세부 정보를 표시하고 사용자 코드에 너무 많은 부담을주는 특수 기술을 통해 할당되어야한다는 것을 기억해야합니다.

+0

아 .. 이해가 안됩니다 .. 당신이 의미하는 바를 정교하게 해석 할 수 있습니까? "operator new"가 thepool에서 메모리를 할당하게함으로써? 이미하고있는 것과는 다른 방식으로 의미합니까? – kamziro

+0

kamziro : 하나 이상의 풀이 필요하지 않다면 전역 변수를 선언하고'operator new'를 사용하면됩니다. – sharptooth

+0

아 맞아요. 나는 하나 이상의 수영장을 가질 계획이지만 그 아이디어에 감사드립니다. – kamziro

관련 문제