본문 바로가기

Book Review

[책] 최고 성능을 구현하는 10가지 검증된 기법, Optimized C++

 

 

 

 

 

 

Optimized C++ , C++ 최적화

 

 

 

올해 7월에 출간된 Optimized C++ (C++ 최적화) 책에서는 C++ 이라는 언어를 생각해보면 "필요한 기능은 모두 구현해놓을테니 여러분이 만들고 싶은 코드를 원하는대로 만들어 보세요" 라는 느낌이 든다고 필자는 말하고 있었다. 사실 시중에 C++ 언어를 배우기에 좋은 책만 나와있지, 최적화 라는 분야를 다루는 책은 거의 없다.

 

그런데 이번에 고맙게도 한빛미디어에서 Optimized C++ 책을 출시해주었다. 앞으로도 희소하면서도 메리트 있는 분야를 다루는 책이 많이 출간되었으면 좋겠다. 또한 이 책을 학부 4학년 때 배울 수 있었더라면 어땠을까 하는 생각도 드는데, 그런 생각 보다는 이미 시간은 지나갔으니 지금 당장 공부하는 것이 낫다는 생각도 든다. 모든 개발자에게 있어 C++을 다루는 사람이라면 짭짤한 책이다. 

 

 

책의 구성은 다음과 같다. 

 

  • 최적화란
  • 컴퓨터 하드웨어와 최적화
  • 성능 측정
  • 문자열 최적화
  • 알고리즘 최적화
  • 동적 할당 변수 최적화
  • 문장 최적화
  • 라이브러리 최적화
  • 검색 및 정렬 최적화
  • 자료구조 최적화
  • 입출력 최적화
  • 동시성 최적화
  • 메모리 관리 최적화 

 

사실 최적화 라는 분야는 소프트웨어나 하드웨어를 개발하는데 있어 필수적인 요소이다. 아직 자료구조를 익히지 못했거나, 간단한 print 문 조차도 어떻게 돌아가는지 이해하지 못했다면 최적화 라는 분야가 필요없게 느껴질 수도 있다. 하지만 최적화 라는 분야는 전통적인 소프트웨어 개발 프로세스에서 코드를 완성하고서 프로젝트 통합 및 테스트 단계에서 수행되는데, 여기서 올바르게 프로그램을 개선하여 "속도", "메모리 사용량", "전력 소비" 등에 대한 이슈들을 해결해야한다.

 

또한 최적화라는 것이 프로그램에서 가장 느린 곳을 개선하면 끝나는게 아니라, 그 다음으로 느린 곳이 다시 가장 느린 곳이 되어 성능을 좌우하게 되는 반복 과정이기 때문에 "실험 과학" 측면에서 개발자의 올바른 경험과 직관을 가지고 프로그램을 수정해나가야 한다고 책에서는 말하고 있었다. 

 

책 목차에서 가장 관심 있는 분야는 메모리 관리 최적화이다. C++ 메모리 관리 API를 사용하여 메모리 관리를 할 수 있는데, 여기서 동적 변수의 생명 주기는 할당, 배치, 사용, 파괴, 해제의 5단계로 나뉜다고 한다. 

 

할당

프로그램은 연속적인 메모리 영역을 가리키는 포인터를 반환하도록 요청하는데, 포인터는 적어도 지정된 수 만큼의 타입이 없는 메모리 바이트를 포함하고 있어야 하며, 메모리를 사용할 수 없는 경우 할당을 실패한다. C 라이브러리 함수 malloc() 과 C++ 함수 operator new() 의 다양한 오버로드가 할당 단계를 관리 할 수 있다 .

 

배치

프로그램은 할당된 메모리에 값을 저장해 동적 변수의 초깃값을 설정한다. 만약 변수가 클래스 인스턴스라면 클래스 생성자 중 하나가 호출된다. 예외 값이 들어올 경우, 메모리 관리자에게 할당된 저장공간을 반환해야하기 때문에 배치를 실패 할 수도 있다. new 표현식이 이와 같다. 

 

사용

프로그램은 동적 변수의 값을 읽고 동적 변수의 멤버 함수를 호출하며 동적 변수에 값을 쓴다. 간단히 말해서, 동적 변수를 이곳 저곳에 사용하는 것이다. 

 

파괴

변수가 클래스 인스턴스라면 프로그램은 클래스의 소멸자를 호출해 동적 변수에 대한 최종 작동을 수행한다. 동적 변수가 갖는 시스템 "자원"을 반환하고 정리한다. 소멸자가 본문에서 처리되지 않은 예외를 던질 경우 파괴되지 않을 수 있다. 이 때 프로그램이 무조건 종료되며 delete 라는 표현이 이 단계를 관리하게 된다. 

 

해제

프로그램은 이전에 파괴된 동적 변수에 속하는 저장 공간을 메모리 관리자에게 반환한다. 라이브러리 함수 free() 와 C++ 함수 operator delete() 의 다양한 오버로드가 해제 단계를 수행 할 수 있다.