일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 루아
- implicit conversion
- virtual function
- 반복자
- effective stl
- 함수 객체
- 언리얼
- 상속
- resource management class
- 메타테이블
- Smart Pointer
- 영화
- reference
- 티스토리챌린지
- exception
- c++
- more effective c++
- operator new
- 오블완
- Effective c++
- 영화 리뷰
- UE4
- 참조자
- 스마트 포인터
- 암시적 변환
- 게임
- 예외
- 비교 함수 객체
- 다형성
- lua
- Today
- Total
목록2024/08 (22)
스토리텔링 개발자
항목 22 : 단독 연산자(op) 대신에 =이 붙은 연산자(op=)를 사용하는 것이 좋을 때가 있다. 사용자가 기대하는 연산자 동작// 아래의 연산자가 동작한다면,x = x + y;x = x - y;// 아래의 연산자도 동작한다고 기대하게 된다.x += y;x -= y;하지만 사용자 정의 타입이라면 위의 두 형태의 코드가 지원되리라는 보장은 전혀 없다.C++에서는 operator+, operatr=, operator+= 사이에 아무 관계가 없다.즉, 사용자의 기대를 충족시키려면 구현하는 수밖에 없다. 대입 형태(operator+=)와 단독 형태(operator+) 관계 맺기대입 형태를 사용해서 단독 형태를 구현하는 것도 괜찮은 방법이다.class Rational{public: ... R..
항목 21 : 오버로딩은 불필요한 암시적 타입 변환을 막는 한 방법이다. 암시적 변환// Unlimited Precision Integerclass UPInt{public: UPInt(); UPInt(int value); ...};const UPInt operator+(const UPInt& lhs, const UPInt& rhs);// 일반적인 사용법UPInt upi1, upi2;...UPInt upi3 = upi1 + upi2;// 이렇게 사용하게 된다면?upi3 = upi1 + 10;upi3 = 10 + upi2;UPInt는 int를 생성자로 받아들이기 때문에 암시적 변환이 일어나 UPInt 타입을 임시 객체로 생성한다.하지만, 임시 객체는 리소스의 낭비이다.사실 이 코드의 목적..
항목 20 : 반환값 최적화(return value optimization)가 가능하게 하자. 객체를 값으로 반환하는 함수리턴할 때 임시 객체의 생성 및 소멸이 필수적으로 발생한다.(항목 19 참조)그렇다면 객체를 반환하지 않으면 발생하지 않을 비용이겠군.하지만 반드시 객체를 반환하지 않으면 안되는 함수도 있다.// 유리수class Rational{public: Rational(int numerator = 0, int denominator = 1); ... int numerator() const; int denominator() const;};// 유리수에 대해 곱셈을 해주는 함수// 반환값이 const여야 하는 이유는 항목 6 참조const Rational operator*(co..
항목 19 : 임시 객체의 원류를 정확히 이해하자. 임시 객체(temporaries)아래의 경우를 임시 객체라 할 수 있을까?templcatevoid swap(T& object1, T& object2){ T temp = object1; // 임시 객체? 아니고 그저 지역 객체 object1 = object2; object2 = temp;}그렇다면 임시 객체란 무엇일까?C++에서의 진짜 임시 객체는 힙 이외의 공간에 생성되는 ‘이름 없는’ 객체이다.즉, 코드 상에서는 드러나지 않는다.이름 없는 객체가 만들어지는 상황함수 호출의 매개변수로 암시적 타입 변환이 적용될 때함수가 객체를 값으로 반환할 때임시 객체의 생성, 소멸 비용은 전체 성능에 의외로 꽤 영향을 준다. 함수 호출의 매개변..
항목 18. 예상되는 계산 결과를 미리 준비하면 처리 비용을 깎을 수 있다. 과도 선행 평가(over-eager evaluation)자주 요구될 것 같은 계산이 있다면, 그 요구를 효율적으로 처리할 수 있는 자료구조를 설계하여 비용을 낮추자.templateclass DataCollection{public: // 아래 수치 데이터들은 과도 선행 평가로 성능 향상을 꾀할 수 있다. NumericalType min() const; NumericalType max() const; NumericalType avg() const; ...}; 캐싱(caching)가장 간단하게 구현할 수 있는 방법계산이 끝났고, 또 다시 사용될 것 같은 값을 캐싱한다.int findCubicleNum..
항목 17. 효율 향상에 있어서 지연 평가는 충분히 고려해 볼 만하다 지연(to be lazy)효율의 측면에서 볼 때, 최선의 계산은 아무것도 하지 않는 것이다.그렇다면 정말 필요할 때가 되기 전까지 코드 실행을 지연시키는 것이 효율적일 것이다.일반적으로 자주 보게 될만한 일반적인 지연 평가 네 가지를 아래에서 살펴본다. 참조 카운팅(Reference Counting)class String { ... };String s1 = "Hello";String s2 = s1; // String의 복사 생성자를 호출한다.// String 복사 생성자가 직관적인 구현이라면,// s2는 s1과 "Hello" 사본을 동시에 들고 있을테지만.. 이는 비용이 크다.직관적인 구현 (즉시 평가(eager evaluati..
항목 16 : 뼛속까지 잊지 말자, 80-20 법칙! 80-20 법칙프로그램 리소스의 80%는 전체 실행 코드의 20%만 사용한다.실행 시간의 80%는 실행 코드의 20%만 소비한다.메모리의 80%는 실행 코드의 20%만 사용한다. 등..단순한 캐치 프라이즈가 아니라 시스템 수행 성능에 대한 사례와 실험적 증거를 기저에 깔고 있는 법칙이다. 80-20 법칙에 대한 다양한 해석프로그래머가 작성하는 대부분의 코드는 그저 그런 수행 성능이다.즉, 전체 수행 성능에는 별 영향을 주지 못한다.소프트웨어에 수행 성능의 문제가 있으면 성능의 발목을 잡는 20%를 찾아내는 작업을 해야 한다.즉, 소수의 코드가 대부분의 성능의 발목을 잡고 있다면, 이는 어림짐작으로 해결할 수 있는 성질의 것이 아니다. 병목 ..
항목 15. 예외 처리에 드는 비용에 대해 정확히 파악하자 객체 생성 성공 여부를 체크하는 자료구조가 소모하는 메모리(항목 10 참조)컴파일러에 따라선 예외 발생 여부를 꺼버릴 수도 있다.극단적인 비용 절감을 위해서는 고려해 볼 수도 있을 것이다.하지만 예외는 C++ 언어의 일부이므로 컴파일러가 이 비용을 완전히 없앨 수는 없다.프로그램은 여러 개의 독립적인 오브젝트(.obj) 파일로 만들어진다.하나의 오브젝트 파일이 예외를 사용하지 않는다고, 다른 오브젝트 파일도 그러리란 법은 없다.오브젝트 파일들이 모두 예외를 사용하지 않는다 쳐도, 링크되는 라이브러리에서 사용한다면?어느 한 부분이라도 예외를 사용하면, 프로그램 전체가 예외를 지원할 수밖에 없다.만약, 예외를 지원하지 않는 라이브러리를 만든다면예..