전체 글

개발자가 스스로 사용자 정의 new 및 delete를 작성하는 데는 여러 가지 이유가 있다. 여기에는 수행 성능 향상, 힙 사용 시의 에러 디버깅, 힙 사용 정보 수집 등의 목적이 있다. new와 delete operator new와 operator delete를 바꾸는 목적은 여러 가지가 있다. 가장 흔한 이유는 다음과 같다. 잘못된 힙 사용을 탐지하기 위해 new한 메모리에 delete를 하는 것을 잊어버리면 메모리가 누출된다. 한 번 new한 메모리를 두 번 이상 delete하면 미정의 동작이 발생한다. 만일 할당된 메모리 주소의 목록을 operator new가 유지해 두고 operator delete가 그 목록으로부터 주소를 하나씩 제거해 주게 만들어져 있다면, 이런 실수는 쉽게 잡아낼 수 있다...
set_new_handler 함수를 쓰면 메모리 할당 요청이 만족되지 못했을 때 호출되는 함수를 지정할 수 있다. 예외불가 new는 영향력이 제한되어 있다. 메모리 할당 자체에만 적용되기 때문이다. 이후에 호출되는 생성자에서는 얼마든지 예외를 던질 수 있다. new 처리자의 동작 원리 할당할 메모리가 없을 때 operator new 함수는 예외를 던지게 되어 있다. 메모리 할당이 제대로 되지 못한 상황에 대한 반응으로 operator new가 예외를 던지기 전에, 사용자 쪽에서 지정할 수 있는 에러 처리 함수를 우선적으로 호출하도록 되어 있는데, 이 에러 처리 함술 가리켜 new 처리자(new_handler)라고 한다. 이와 같은 메모리 고갈 상황을 처리할 함수를 사용자 쪽에서 지정할 수 있도록, 표준 ..
템플릿 메타프로그래밍은 기존 작업을 런타임에서 컴파일 타임으로 전환하는 효과를 낸다. 따라서 TMP를 쓰면 선행 에러 탐지와 높은 런타임 효율을 낼 수 있다. TMP는 정책 선택의 조합에 기반하여 사용자 정의 코드를 생성하는 데 쓸 수 있으며, 특정 타입에 대해 부적절한 코드가 만들어지는 것을 막는 데도 쓸 수 있다. 템플릿 메타프로그래밍 템플릿 메타프로그래밍(template metaprogramming: TMP)은 컴파일 도중에 실행되는 템플릿 기반의 프로그래밍을 말한다. 템플릿 메타프로그램은 C++ 컴파일러가 실행시키는, C++로 만들어진 프로그램이다. TMP프로그램이 실행을 마친 후엔 그 결과로 나온 출력물이 다시 보통의 컴파일 과정을 거친다. C++은 템플릿 메타프로그래밍을 염두에 두고 설계되지는..
특성정보 클래스는 컴파일 도중에 사용할 수 있는 타입 관련 정보를 만들어낸다. 또한 특성정보 클래스는 템플릿 및 템플릿 특수 버전을 사용하여 구현한다. 함수 오버로딩 기법과 결합하여 특성정보 클래스를 사용하면, 컴파일 타임에 결정되는 타입별 if...else 점검문을 구사할 수 있다. 타입에 대한 정보는 특성정보 클래스를 사용 STL은 기본적으로 컨테이너 및 반복자, 알고리즘의 템플릿으로 구성되어 있지만, 이 외에 유틸리티라고 불리는 템플릿도 몇 개 들어 있다. 이들 중 하나가 advance라는 이름의 템플릿인데, 이 템플릿이 하는 일은 지정된 반복자를 지정된 거리만큼 이동시키는 것이다. template void advance(IterT& iter, DistT d); // iter를 d만큼 이동 간단히 ..
모든 매개변수에 대해 암시적 타입 변환을 지원하는 템플릿과 관계가 있는 함수를 제공하는 클래스 템플릿을 만들려고 한다면, 이런 함수는 클래스 템플릿 안에 프렌드 함수로서 정의해라. 비멤버 함수를 클래스 템플릿 안에 모든 매개변수에 대해 암시적 타입 변환이 되도록 만들기 위해서는 비멤버 함수로 만들어야 한다. Rational 클래스와 operator*함수를 템플릿으로 만들 것이다. template class Rational { public: Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; ... }; template const Rational ope..
호환되는 모든 타입을 받아들이는 멤버 함수를 만들려면 멤버 함수 템플릿을 사용해라. 일반화된 복사 생성 연산과 일반화된 대입 연산을 위해 멤버 템플릿을 선언했다 하더라도, 보통의 복사 생성자와 복사 대입 연산자는 직접 선언해야 한다. 호환되는 모든 타입을 받아들이는 데는 멤버 함수를 사용 스마트 포인터는 그냥 포인터처럼 동작하면서도 포인터가 주지 못하는 기능을 갖고 있다. 예를 들면 힙 기반 자원의 삭제를 지원하는 auto_ptr이나 tr1::shared_ptr 객체가 있다. STL 컨테이너의 반복자도 스마트 포인터와 같다. 포인터에도 스마트 포인터로 대신할 수 없는 특징이 있다. 그중 하나가 암시적 변환을 지원하는 점이다. 파생 클래스 포인터는 암시적으로 기본 클래스 포인터로 변환되고, 비상수 객체에 ..
템플릿을 사용하면 비슷비슷한 클래스와 함수가 여러 개 만들어진다. 따라서 템플릿 매개변수에 종속되지 않은 템플릿 코드는 비대화의 원인이 된다. 비타입 템플릿 매개변수로 생기는 코드 비대화의 경우, 템플릿 매개변수를 함수 매개변수 혹은 클래스 데이터 멤버로 대체함으로써 비대화를 없앨 수 있다. 타입 매개변수로 생기는 코드 비대화의 경우, 동일한 이진 표현구조를 가지고 인스턴스화되는 타입들이 한 가지 함수 구현을 공유하게 만듦으로써 비대화를 감소시킬 수 있다. 매개변수에 독립적인 코드는 템플릿에서 분리 템플릿은 코딩 시간 절약, 코드 중복 회피에 효과가 있다. 하지만, 아무 생각 없이 템플릿을 사용하면 똑같은 내용의 코드와 데이터가 여러 개 중복되어 이진 파일로 만들어지는 코드 비대화가 생길 수 있다. 코드..
hvv_an
이미난