7.30(월) C++ - Small Object Allocator

from Study/C++ 2007/07/31 16:47 view 27050

#include <iostream>

using namespace std;

 

// Small Object Allocator

// More Effective C++ 항목8

// Modern C++ design 4- 작은 객체의 메모리 할당기 만들기

// 미리 메모리를 크게 잡아놓고(리스트) new/delete를 해준다.
// 메모리 할당과 소멸시간을 줄여준다.
// 메모리를 사용하지 않으면 하드디스크에 페이지 형태로 잡아놓기 때문에
// 메모리의 낭비를 걱정 하지 않아도 된다??
 

class Point

{

        int x;

 

        union

        {

               int y;

               Point* next;

        };

        static Point* FreeList;

 

public:

        Point( int a = 0, int b = 0 ) : x(a), y(b) {}

 

        void* operator new( size_t sz )

        {

               if( sz != sizeof(Point) )      // Point 객체 할당이 아니라면

                       return ::operator new( sz );  // 전역new를 사용하게 한다.

               if( FreeList == 0 )           // 최초 실행되는 경우

               {

                       // 전역operator new를 사용해서500개를 사용하자.

                       FreeList = (Point*)::operator new(sizeof(Point)*500);

 

                       // single linked list로 연결한다.

                       for( int i = 0; i < 499; ++i )

                              FreeList[i].next = &FreeList[i+1];

               }

               // 1번째 노드를 떼어서 리턴해 준다.

               Point* temp = FreeList;

               FreeList = FreeList->next;

 

               return temp;

        }

        // delete 시에도 아래함수가 호출된다.

        // delete는 오버로딩이 되지 않는다.
        //
, 멤버일때 아래 모양만 허용된다. 자기를 delete를 방지??

        void operator delete( void* p, size_t sz )

        {

               if ( p == 0 ) return;         //NULL 포인터인지를 확인해줘야 한다.

 

               if( sz != sizeof(Point) )

               {

                       ::operator delete(p);

                       return;

               }

 

               // List의 제일 앞부분에 놓는다.

                Point* temp = (Point*)p;

               temp->next = FreeList;

               FreeList = temp;

        }      

};

 

Point* Point::FreeList = 0;

 

 

void main()

{

        Point* p1 = new Point( 1, 1 );

        Point* p2 = new Point( 2, 2 );

        Point* p3 = new Point( 3, 3 );

 

        cout << p2 << endl;

        delete p2;

 

        Point* p4 = new Point(0, 0);

 

        cout << p4 << endl;    // p4 와 같은주소는 p1, p2, p3중 어느것 일까요?

 

        delete p1;

        delete p3;

 

        Point* p5 = 0;

        delete p5;                    //NULL 포인터도 delete 가능하다.

}

 

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다