일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- virtual function
- 암시적 변환
- 예외
- UE4
- 영화
- 비교 함수 객체
- 메타테이블
- 오블완
- exception
- reference
- effective stl
- 언리얼
- lua
- 다형성
- Effective c++
- 영화 리뷰
- 게임
- operator new
- Smart Pointer
- 루아
- 참조자
- 상속
- 반복자
- implicit conversion
- more effective c++
- c++
- resource management class
- 스마트 포인터
- 티스토리챌린지
- Vector
- Today
- Total
목록개발/Effective C++ (55)
스토리텔링 개발자
항목 55 : Boo자유친! 부스트를 늘 여러분 가까이에. 부스트란?C++ 개발자들의 단체이자 무료 다운로드가 가능한 C++ 라이브러리 집합을 동시에 일컫는 고유명사이다.차별점부스트는 C++ 표준화 위원회와 밀접하고 영향력 있는 밀월관계가 있다.표준 C++에 추가될 수 있는 기능들의 시험장소라는 의미이다.라이브러리 승인 과정이 까다롭다. 라이브러리 승인 과정 (공개 동료 심사(public peer review))사전 심사(perliminary examination)부스트 최소 요구사항 만족 여부 확인컴파일 되는 컴파일러가 최소 두개 이상일 것.라이센스가 적절한지 여부공식 심사설계와 구현이 얼마나 우수한가다른 컴파일러와 운영체제들에 맞추어 이식할 수 있는 코드인가대상 사용자들(특정 분야 종사자들)에..
항목 54 : TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 C++ 차기 버전C++0x 라고 불렸지만, 실제로 반영되고 나서의 이름은 C++11.(모던 C++)TR1(C++ 라이브러리 작업 그룹이 작성한 "1차 기술 보고서(Technical Report 1)")의 대부분은 C++11에 포함되었다. 각 라이브러리 구성요소C++98 표준 C++ 라이브러리 주 구성요소표준 템플릿 라이브러리(STL)컨테이너, 반복자, 알고리즘, 함수 객체 등iostream사용자 정의 버퍼링국제화 기능 가능한 입출력cin, cout, cerr, clog 등의 사전 정의 객체국제화 지원여러 로케일 활성화 기능wchar_t 등의 타입(대개 16비트 문자) 및 wstring(wchar_t 타입으로 정의한 str..
항목 53 : 컴파일러 경고를 지나치지 말자 컴파일러 경고의 예시class B{public: virtual void f() const;};class D : public B{public: virtual void f(); // const가 아니라서 이름 가려짐};// 아마도 아래와 같은 경고가 나올 것이다.// warning: D::f() hides virtual B::f()경고는 f 함수가 재선언된 것이 아니라, 이름이 아예 가려진다는 사실을 알려주고 있다.(항목 33 참조)경고를 읽지 않고 지나치면 오버라이드 되지 않은 상황이 언젠가 버그가 되어 돌아올지도.. 결론어떤 경고 메시지를 없애기 전에, 그 경고의 의미를 정확히 파악하자.경고 메시지를 없애는 데 급급하다 보면 정말 수정해야 하..
항목 52 : 위치 지정 new를 작성한다면 위치 지정 delete도 같이 준비하자. new 중 기본 생성자에서 예외가 발생한다면?Widget* pw = new Widget;위 코드는 실행 중 두 개의 함수가 순차적으로 호출된다. (항목 16, 항목 17 참조)메모리 할당을 위한 operator new 호출Widget의 기본 생성자 호출만약 메모리 할당은 성공했으나, 기본 생성자에서 예외가 발생한다면?이미 할당된 메모리를 취소해야 한다.하지만 메모리에 대한 포인터가 pw에 할당되지 않고 예외가 발생했으므로, 사용자 코드에서는 메모리를 해제할 수 없다.그러므로 C++ 런타임 시스템이 이 역할을 맡아야 한다.이 상황에서 C++ 런타임 시스템이 하는 일은?호출한 operator new 함수와 짝이 되는 o..
항목 51. new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아두자 operator new 구현 시 요구사항반환값이 제대로 되어 있어야 한다.가용 메모리가 부족할 경우 new 처리자 함수를 호출해야 한다. (항목 49 참조)크기가 없는(0바이트) 메모리 요청에 대한 대비를 해야 한다.실수로 ‘기본(normal)’ 형태의 new가 가려지지 않도록 해야 한다. (항목 52 참조) 요구사항을 지키며 operator new 구현구현?요청된 메모리를 마련해 줄 수 있는 경우그 메모리에 대한 포인터를 반환한다.요청된 메모리를 마련해 줄 수 없는 경우bad_alloc 타입의 예외를 던지면 된다. (항목 49 참조)말로는 쉽지만 실제 구현은 꽤 까다롭다.. 문제점operator new는 메모리..
항목 50 : new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해두자 operator new / delete를 커스텀하는 이유잘못된 힙 사용 탐지를 위해new 한 메모리에 대해 delete를 잊으면 메모리 누수가 발생한다.new 한 메모리에 두번 이상 delete 하면 미정의 동작을 한다.할당된 메모리 주소의 목록을 operator new가 유지하고 delete에서 제거하게 만들면 실수를 방지할 수 있을 것이다.데이터 오버런(overrun, 할당된 메모리 블록 끝을 넘어 뒤에 기록), 데이터 언더런(underrun, 할당된 메모리 블록 시작을 넘어 앞에 기록)이 발생할 수 있다.메모리를 약간 더 할당해서 오버런 / 언더런 탐지용 바이트 패턴을 구현할 수 있다.효율을 향상시키기 위해컴파일..
항목 49 : new 처리자의 동작 원리를 제대로 이해하자 사용자의 메모리 할당 요청 실패 상황operator new 함수는 예외를 던지게 되어 있다.오랜 옛날(구닥다리 컴파일러)에는 null을 반환했지만..그리고 예외를 던지기 전에, 사용자 쪽에서 지정할 수 있는 에러 처리 함수를 우선적으로 호출하게 되어 있다. new 처리자(new-handler, 할당에러 처리자)사용자 쪽에서 지정할 수 있는 에러 처리 함수.표준 라이브러리에는 set_new_handler라는 함수가 준비되어 있다.namespace std{ typedef void (*new_handler)(); // 이전 new 처리자를 리턴한다. new_handler set_new_handler(new_handler ..
항목 48. 템플릿 메타 프로그래밍, 하지 않겠는가? 템플릿 메타 프로그래밍(TMP)컴파일 도중에 실행되는 템플릿 기반의 프로그램을 작성하는 일을 말한다.템플릿 메타 프로그램은 C++ 컴파일러가 실행시키는, C++로 만들어진 프로그램이다. 템플릿 메타 프로그래밍(TMP)의 강점다른 방법으로는 까다롭거나 불가능한 일을 굉장히 쉽게 할 수 있다.C++ 컴파일이 진행되는 동안에 실행되기 때문에, 기존 작업을 런타임에서 컴파일 타임으로 전환할 수 있다.이를 통해 두 가지 이득을 취할 수 있는데,일반적으로 프로그램 실행 도중에야 잡을 수 있었던 에러들을 컴파일 타임에 찾아낼 수 있다.TMP를 써서 만든 C++ 프로그램이 효율적일 여지가 높다.컴파일 타임에 동작을 다 해가지고 오기 때문에 실행 코드가 작아지..