2. 개요 시작 메모리 관리자의 로그 기록 결과 보고 몇 가지 염두에 둘 것들 개선 방향 차례
3. 점점 커져가는 게임 프로그램 점점 필요해지는 메모리 사용 관리 메모리 사용 상태에 대한 분석 기능을 요구 사용하기 편하게 만들어야 한다. 자료 분석을 위한 비용에 대한 부담을 줄여야 한다. 최소한 디버그 빌드나 매크로 정의 빌드로 분석한다. 개요
4. 메모리 할당/해제 하는 new/delete 루틴을 오버로딩 한다. 오버로딩한 함수에서 필요한 정보를 받을 수 있게 #define 매크로 로메모리 명령문들을 재정의 한다. 책에는 Visual C++ 에서 정의하는 __FILE__, __LINE__ 을 사용한다. 이를 통해 메모리에 접근할 때 할당크기, 파일(__FILE__) 이름, 행번호 등을 받을 수 있게 한다. 시작
5. 메모리 사용 정보를 연쇄 헤쉬 테이블에 저장한다. Chained hash table 이 뭐냐구요? (map + linked list) 할당 사이즈(주소), 앞뒤 여백, 할당 종류, 파일이름, 소스 라인등 정보를 구조체로 저장한다. 테이블에는 현재 할당된 메모리 정보들만 남게 해서, 프로그램 종료시 남은 구조체를 확인해서 누수를 확인한다. 메모리 할당 위치 앞뒤에 여백경계를 준 상태로 할당한다. 메모리 관리자의 로그 기록
6. 여백 공간에 정해진 32비트 값을 채우고 해제할 때 값을 비교해서 침범했는지 확인한다. 메모리 관리자가 할당 용량, 실제 쓰인 용량(여백제외), 가장 큰 메모리 블록 정보 등을 관리한다. 경계 영역에 해당한 값으로 초기 할당값을 사용한다. 이렇게 하면 따로 경계 영역을 위한 기록을 할 필요가 없다. 그래서 내용에서는 32비트 long 값을 이용한다. 만약, 맞아 떨어지지 않으면 0xE나 static_cast로 초기화 메모리 관리자의 로그 기록
7. 메모리 관리자가 해제될 때 결과를 기록한다. 메모리 관리자는 제일 먼저 생성되고 제일 나중에 소멸해야 된다. Visual C++ 에서는 헤더파일의 정적 개체를 코드 출현 순으로 생성하고, 반대 순서로 해제함을 이용한다. ::ateexit() 에 맨 먼저 등록해서 제일 나중에 호출되게 한다. 결과 보고
8. STL 을사용할때 헤더파일 순서로 인해 오류가 발생할 수 있으므로, 커스텀 할당/해제 매크로 헤더 파일을 #define, #undefine하는 헤더 2개를 사용한다. 처음엔 #undefine하고 난 다음에 STL 헤더를 include 하고 그 다음에 #define 하게 해준다. 몇 가지 염두할 점
9. MFC 처럼 자체적으로 메모리 할당/해제 루틴을 쓰는 라이브러리를 같이 쓰게 될 경우, 이때 사용하고 있는 메모리 관리자를 겹치지 않게 하기 위해 위 방법 처럼 #ifdef로 순서를 처리해준다. 몇 가지 염두할 점
10. 상용 엔진에서는 어떻게 사용하고 있을까? Gamebryo에서 사용하는 NiMemoryTracker기능 실전 예제