본문 바로가기
책 정리/Effective C++ 3rd

항목 50. new a및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자

by ocean20 2020. 4. 1.

컴파일러가 기본 제공하는 operator new, operator delete 오버로딩을 통해 바꾸고 싶은 경우는 언제 일까? 일반적으로 컴파일러가 제공하는 operator new, operator delete 대체로 쓸만하다. 사용자가 오버로딩을 통해 재정의한다면 수동으로 지정해줄 관례들이 있다. 사용자가 본인의 프로젝트에 알맞은 오버로딩을 구현한다면 훨씬 효율적인 operator new , operator delete 탄생할 있다.

어쨌든, 지금시간에는 언제 operator new, delete 바꾸어야 하는 알아보자.

 

1. 잘못된 힙 사용을 탐지하기 위해서

  - new delete하지 않으면 메모리 누수 발생한다. 또한 delete 중복으로 동작시키면 프로그램은 미정의 동작을 일으킨다. 나아가 메모리접근과정에 문제가 생긴다면 (over-run, under-run 같은) operator new, delete 통해 이를 감지하고 처리할 있기 때문에 operator new, delete 수정하는것이다.

 

2. 효율을 높이기 위해

  - 앞서말한것처럼 기본 제공 operator new, operator delete 일반적인 상황을 처리하도록 설계되어 있어, 일반적이다. 따라서 특수화된 상황에서는 사용자가 작성한 버전이 효율적일 있다.

 

3. 동적 할당 메모리의 실제 사용에 관한 통계 정보를 수집하기 위해서

  - 우리가 만드는 sw 실제로 동적메모리를 어떻게 사용하는지 데이터를 수집하기 위해 operator new, delete 오버로딩한다. 이와 같은 데이터 수집은 더나은 메모리 관리를 위해 사용될 있다.

 

4. 할당 및 해제 속력을 높이기 위해서

  - 부스트의 Pool 라이브러리는 고정된 크기의 객체만 만들어주는 할당자이다. 이를 응용하여, 클래스 전용 할당자를 만들어준다. 만약 우리의 응용프로그램이 단일스레드로 동작하는데 컴파일러는 다중스레드 환경에서의 할당자를 제공한다면, 사용자는 단일스레드용 할당자를 만들어 속력이득을 수있다.

 

5. 기본 메모리 관리자의 공간 오버헤드를 줄이기 위해서

  - 기본 제공 할당자는 각각의 메모리블록을 지울때 비용이 많이든다.. 크기가 작은 객체에 대한 튜닝된 할당자로 Boost Pool라이브러리를 사용하여 오버헤드를 줄인다.

 

6. 적당히 타협한 기본 할당자의 바이트 정렬 동작을 보정하기 위해서.(바이트 정렬의 이점)

  - x86아키텍처에서 double 8바이트로 정렬되어있을때 read/write 속도가 가장빠르다. 하지만 시중 컴파일러는 8바이트 정렬 기능을 보장하지 않는 것들이 있다고 한다.

 

7. 임의의 관계를 맺고 있는 객체들을 한 군대에 나란히 모아 놓기 위해서. (page fault)

  - 특정 자료구조가 한번에 동시에 쓰이기에 page fault 비용이 많이든다. 이를 최소화하기 위해 해당 자료구조를 담을 힙을 생성함으로서 가장 적은 페이지를 차지하게 하여 효과를 본다.

 

8. 그때그때 원하는 동작을 수행하도록 하기 위해

  - 1~ 7 외의 다른 동작을 원할 때

 

 

이것만은 잊지 말자.

1. 컴파일러 기본제공하는 operator new 와 operator delete 에 대해서 알아 두자.

2. 사용자 정의 new delete 작성하는데는 타당한이유가 있다. 수행성능향상, 힙사용시 에러디버깅, 사용정보 수집 등이 있다.

댓글