C++/Effective C++

부스트는 동료 심사를 거쳐 등록되고 무료로 배포되는 오픈 소스 C++라이브러리를 개발하는 모임이다. 또한 C++ 표준화에 있어서 영향력 있는 역할을 맡고 있다. 부스트에서 배포되는 라이브러리들 중엔 TR1 구성요소에 들어간 것도 있지만, 그 외에 다른 라이브러리들도 많다. 부스트 부스트는 품질이 우수하고 이식성이 좋은 라이브러리이다. http://boost.org Boost C++ Libraries Welcome to Boost.org! Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries a..
최초에 상정된 표준 C++ 라이브러리의 주요 구성요소는 STL, iostream, 로케일 등이다. 여기에는 C89의 표준 라이브러리도 포함되어 있다. TR1이 도입되면서 추가된 것은 스마트 포인터, 일반화 함수 포인터(tr1::function), 해시 기반 컨테이너, 정규 표현식 그 외의 10개 구성요소이다. TR1 자체는 단순히 명세서이다. TR1의 기능을 사용하기 위해서는 명세를 구현한 코드를 구해야 한다. TR1 구현을 구할 수 있는 자료처 중 한 군데가 바로 부스트이다. TR1을 포함한 표준 라이브러리 C++ 표준에는 계속해서 새로운 기능이 추가되어왔다. TR1은 C++ 라이브러리 작업 그룹이 작성한 1차 기술 보고서이다. TR1이 포함된 것을 C++ 표준 1.1이라고 부른다. TR1을 비롯한 C..
컴파일러 경고를 쉽게 지나치지 마라. 컴파일러에서 지원하는 최고 경고 수준에도 경고 메시지를 내지 않고 컴파일되는 코드를 만드는 쪽으로 노력해라. 컴파일러 경고에 너무 의존하지 마라. 컴파일러마다 경고를 내는 부분이 다르다. 지금 코드를 다른 컴파일러로 이식하면 경고 메시지가 달라질 수 있다. 컴파일러 경고 컴파일러 경고를 무시하면 안 된다. 예를 들어 보자. class B { public: virtual void f() const; }; class D: public B { public: virtual void f(); }; 가상 함수인 B::f를 D::f에서 재정의하겠다는 의도인데, 실수가 있다. B 클래스의 f는 상수 멤버 함수이지만, D 클래스의 f에는 const가 붙어 있지 않다. 이 코드를 컴파..
operator new 함수의 위치지정 버전을 만들 때는, 이 함수와 짝을 이루는 위치지정 버전의 oeprator delete 함수도 꼭 만들어야 한다. 그렇지 않으면, 메모리 누출이 생길 수 있다. new와 delete의 위치지정 버전을 선언할 때는, 의도한 것과 달리 표준 버전이 가려지는 일이 생기지 않도록 주의해야 한다. 위치지정 new & 위치지정 delete 다음과 같은 new표현식을 썼을 때 호출되는 함수는 두 개다. Widget* pw = new Widget; 메모리 할당을 위해 operator new가 호출되고, 그 뒤를 이어 Widget의 기본 생성자가 호출된다. 여기서, 첫 번째 함수 호출은 무사히 지나갔는데 두 번째 함수 호출이 진행되다가 예외가 발생했다고 가정해 보자. 그렇다면 첫 ..
관례적으로, operator new 함수는 메모리 할당을 반복해서 시도하는 무한 루프를 가져야 하고, 메모리 할당 요구를 만족시킬 수 없을 때 new 처리자를 호출해야 하며, 0바이트에 대한 대책도 있어야 한다. 클래스 전용 버전은 자신이 할당하기로 예정된 크기보다 더 큰 메모리 블록에 대한 요구도 처리해야 한다. operator delete 함수는 널 포인터가 들어왔을 때 아무 일도 하지 않아야 한다. 클래스 전용 버전의 경우에는 예정 크기보다 더 큰 블록을 처리해야 한다. new와 delete 작성 관례 사용자 정의 new와 delete를 작성할 때 지켜야 하는 관례가 있다. 우선, operator new를 보면 요구사항 몇 가지를 지켜야 한다. 반환 값이 제대로 되어 있어야 하고, 가용 메모리가 부..
개발자가 스스로 사용자 정의 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..
hvv_an
'C++/Effective C++' 카테고리의 글 목록