Books
[Effective Modern C++] 4. 추론된 타입을 파악하는 방법을 알아두자
[Effective Modern C++] 4. 추론된 타입을 파악하는 방법을 알아두자
2022.08.06IDE 편집기 IDE(통합 개발 환경)의 코드 편집기 중에는 프로그램 객체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 객체의 타입을 표시해 주는 것이 많다. const int theAnswer = 42; auto x = theAnswer; // int auto y = &theAnswer; // const int* 이런 일이 가능하려면 편집기의 코드가 어느 정도는 컴파일 가능한 상태여야 한다. 컴파일러가 코드를 파싱 해서 타입 추론을 수행할 수 있을 정도로 편집기의 코드가 완성되어 있지 않으면 편집기는 요청된 객체의 타입을 표시할 수 없다. 일반적으로 int와 같은 간단한 타입의 경우에는 IDE가 알려준 정보가 쓸만하지만, 좀 더 복잡한 타입이 관여할 때에는 IDE가 표시한 정보가 그리 도..
[Effective Modern C++] 3. decltype의 작동 방식을 숙지하자
[Effective Modern C++] 3. decltype의 작동 방식을 숙지하자
2022.08.06decltype은 주어진 이름이나 표현식의 구체적인 타입을 반환한다. 아래의 예시를 보자. const int i = 0; // decltype(i)은 const int bool f(const Widget& w); // decltype(w)은 const Widget&, decltype(f)은 bool(const Widget&) struct Point { int x, y; // decltype(Point::x)은 int, decltype(Point::y)은 int }; Widget w; // decltype(w)은 Widget if (f(w)) ... // decltype(f(w))은 bool template // std::vector class vector { public: ... T& operator[]..
[Effective Modern C++] 2. auto의 타입 추론 규칙을 숙지하자
[Effective Modern C++] 2. auto의 타입 추론 규칙을 숙지하자
2022.08.06항목 1에서 템플릿 타입 추론은 아래의 함수 템플릿을 사용하여 설명한다. template void f(ParamType param); f(expr); // 호출 auto를 이용해서 변수를 선언할 때 auto는 템플릿의 T와 동일한 역할을 하며, 변수의 타입 지정자(type specifier)는 ParamType과 동일한 역할을 한다. 아래의 예시를 보자. // 여기서 x의 타입 지정자는 그냥 auto 자체이다. 반면, 다음 선언에서 auto x = 27; // 타입 지정자는 const auto이다. const auto cx = x; // 타입 지정자가 const auto&이다. const auto& rx = x; // 이 예들에서 x와 cx, rx의 타입들을 추론할 때, 컴파일러는 마치 선언마다 템플릿 ..
[Effective Modern C++] 1. 템플릿 타입 추론 규칙을 숙지하자
[Effective Modern C++] 1. 템플릿 타입 추론 규칙을 숙지하자
2022.08.06아래는 함수 템플릿의 선언과 호출부의 의사 코드이다. template void f(ParamType param); f(expr); // f를 호출 컴파일 도중 컴파일러는 expr을 이용해서 두 가지 타입을 추론하는데, 하나는 T에 대한 타입 추론이고 하나는 ParamType에 대한 타입 추론이다. 이 두타입은 다른 경우가 많은데, 이는 ParamType에 보통 const나 참조자(&, &&) 같은 수식어들이 붙기 때문이다. 예를 들어 아래처럼 템플릿의 선언을 하고 호출한다고 하자. // 선언 template void f(const T& param); --- // 호출 int x = 0; f(x); 이 경우 T는 int로 추론되나 ParamType은 const int&로 추론된다. T에 대해 추론된 타입은..
[Effective C++] 55. Boo子有親! 부스트를 늘 여러분 가까이에
[Effective C++] 55. Boo子有親! 부스트를 늘 여러분 가까이에
2022.07.24이번 장은 Boost와 친해지라는 내용의 항목이다. 부스트(http://boost.org)는 C++ 개발자들의 단체이자 무료 다운로드가 가능한 C++라이브러리 집합을 동시에 일컫는 고유명사이다. 부스트 외에도 여러 단체 및 웹사이트가 있으나, 부스트는 C++ 표준화 위원회와 밀접한 관계에 있으며, 실제로 Boost에서 사용되던 것이 c++표준으로 추가된 경우도 있다. 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..
[Effective C++] 54. TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자
[Effective C++] 54. TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자
2022.07.24C++98의 기존 기능 1. 표준 템플릿 라이브러리(STL) 2. iostream 3. 국제화 지원 4. 수치 처리 자원 5. 예외 클래스 계통 6. C89의 표준 라이브러리 TR1을 통해 명시된 새로운 구성요소 1. 스마트 포인터 2. tr1::function 3. tr1::bind 4. 해시 테이블 5. 정규 표현식 6. tuple 7. tr1::array 8. tr1::mem_fn 9. tr1::reference_wrapper 10. 난수발생 11. 특수 용도의 수학 함수 12. C99 호환석 확장 기능 13. 타입 특성정보 14. tr1::result_of 요약 최초에 상정된 표준 C++라이브러리의 주요 구성요소는 STL, iostream, 로케일 등이다. 여기에는 C89의 표준 라이브러리도 포함..
[Effective C++] 53. 컴파일러 경고를 지나치지 말자
[Effective C++] 53. 컴파일러 경고를 지나치지 말자
2022.07.24우리는 우리가 사용하고 있는 컴파일러가 띄워주는 에러 메시지들에 어느 정도 익숙해지고 나면, 이 외의 다른 메시지들도 어떤 것은 넘어가도 되고, 어떤 것은 없애주어야 하는지 이해하게 되는 수준이 오게 된다. 우리는 경고 메시지의 참 뜻을 명확하게 이해해야 하며, 지워나가는 습관을 들어야 한다. 요약 컴파일러 경고를 쉽게 지나치지 말자. 컴파일러에서 지원하는 최고 경고 수준에도 경고 메시지를 내지 않고 컴파일되는 코드를 만드는 쪽에 전력을 다하자. 컴파일러 경고에 너무 기대는 인생을 지양하자. 컴파일러마다 트집을 잡고 경고를 내는 부분들이 천차만별이기 때문이다. 지금 코드를 다른 컴파일러로 이식하면서 여러분이 익숙해져 있는 경고 메시지가 온 데 간 데 없이 사라질 수 있다.
[Effective C++] 52. 위치지정 new를 작성한다면 위치지정 delete도 같이 준비하자
[Effective C++] 52. 위치지정 new를 작성한다면 위치지정 delete도 같이 준비하자
2022.07.24new 표현식을 사용했을 때 호출되는 두 가지 함수 Widget * pw = new Widget; 위에서는 함수 두 개가 호출된다. 우선 메모리 할당을 위해 operator new가 호출되고, 그 뒤를 이어 Widget의 기본 생성자가 호출된다. 여기서 첫 번째 함수 호출은 무사히 지나갔는데 두 번째 함수 호출이 진행되다가 예외가 발생했다고 가정해보자. 이렇게 사고가 났을 경우 첫 단계에서 이미 끝난 메모리 할당을 취소해야 한다. 왜냐하면 메모리 누수가 발생하기 때문이다. 하지만 Widget 생성자에서 예외가 튀어나오면 pw에 포인터가 대입될 일은 절대로 안 생기기 때문에 사용자 코드에서는 이 메모리를 해제할 수 없다. 따라서 이 메모리의 해제는 C++ 런타임 시스템이 맡아줘야 한다. C++ 런타임 시스..
[Effective C++] 51. new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자
[Effective C++] 51. new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자
2022.07.23operator new의 기본 요구사항 1. 반환 값이 제대로 되어있어야 한다. 요청된 메모리를 마련할 수 있는 경우 반환 값은 메모리에 대한 포인터이다. 요청된 메모리를 마련할 수 없는 경우 bad_alloc 타입의 예외를 던진다. 2. 가용 메모리가 부족할 경우에는 new 처리자 함수를 호출해야 한다. 3. 크기가 없는 메모리 요청(0바이트)에 대한 대비책을 갖춰두어야 한다. 4. 기본 형태의 new가 가려지지 않도록 한다. 비멤버 버전의 operator new 함수 의사 코드 operator new 멤버 함수는 파생 클래스 쪽으로 상속이 되는 함수이다. // 다른 매개변수를 추가로 가질 수 있다. void * operator new(std::size_t) throw(std::bac_alloc) { ..
[Effective C++] 50. new 및 delete를 언제 바꿔야 좋은 소리를 들을지 파악해 두자
[Effective C++] 50. new 및 delete를 언제 바꿔야 좋은 소리를 들을지 파악해 두자
2022.07.16일반적으로 컴파일러가 제공하는 operator new, operator delete는 대체로 쓸만하다. 그리고 사용자가 오버로딩을 통해 재정의한다면 수동으로 지정해줄 관례들이 있다. 따라서 기본 operator의 new와 delete를 사용해도 무관하지만 사용자가 본인의 프로젝트에 알맞은 오버로딩을 구현한다면 훨씬 효율적인 operator new , operator delete가 탄생할 수도 있는데 언제 operator new, delete를 바꾸어야 하는 지 알아보자. 사용자 정의 new와 delete를 고려해야 할 때 1. 잘못된 힙 사용을 탐지하기 위해 new 한 메모리에 delete 하는 것을 잊어버리면 메모리 누출이 되고, 이미 메모리 해제한 메모리를 또 메모리 해제한다면 프로그램은 터질 것이다..
[Effective C++] 49. new 처리자의 동작 원리를 제대로 이해하자
[Effective C++] 49. new 처리자의 동작 원리를 제대로 이해하자
2022.07.16메모리 할당 과정 operator new는 메모리 할당이라는 임무를 맡고 있으며, 임무 실패 시 예외를 발생시킨다. 하지만, 예외를 던지기 전 사용자 에러 처리 함수를 선 호출하도록 설계되어있는데, 이 에러 처리 함수를 가리켜 new 처리자(new-handler, 할당 에러 처리자)라고 한다. 이와 같은 메모리 고갈 상황을 처리할 함수를 사용자 쪽에서 지정할 수 있도록 표준 라이브러리에서는 set_new_handler라는 함수가 준비되어있다. 이 함수는 에 선언되어 있다. namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); } new_handler는 받는 것도 없고 반환하는 것도 ..
[Effective C++] 48. 템플릿 메타프로그래밍, 하지 않겠는가?
[Effective C++] 48. 템플릿 메타프로그래밍, 하지 않겠는가?
2022.07.16템플릿 메타프로그래밍이란? 컴파일 도중에 실행되는 템플릿 기반의 프로그램을 작성하는 일을 뜻한다. TMP 프로그램이 실행을 마친 후엔 그 결과로 나온 템플릿으로부터 인스턴스화 된 C++ 소스코드가 다시 보통의 컴파일 과정을 거치는 것이다. 템플릿 메타프로그래밍(TMP)의 장점 1. TMP를 쓰면 다른 방법으로는 까다롭거나 불가능한 일을 쉽게 할 수 있다. 2. 템플릿 메타프로그램은 C++ 컴파일이 진행되는 동안에 실행되기 때문에, 기존 작업을 런타임 영역에서 컴파일 타임 영역으로 전환할 수 있다. 런타임 영역을 컴파일 타임 영역으로 끌고 오기 때문에 실행 도중 터졌던 문제를 컴파일 도중에 찾을 수 있다. 또한, 컴파일 타임에 동작을 다 하기 때문에 실행 코드가 작아지고, 실행 시간도 짧아지며, 메모리도 ..