일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 영화 리뷰
- exception
- resource management class
- implicit conversion
- 참조자
- more effective c++
- 함수 객체
- 비교 함수 객체
- UE4
- 오블완
- 예외
- 게임
- Effective c++
- operator new
- c++
- 영화
- 상속
- 반복자
- 메타테이블
- 다형성
- effective stl
- 스마트 포인터
- 티스토리챌린지
- lua
- 암시적 변환
- Smart Pointer
- 루아
- reference
- 언리얼
- virtual function
- Today
- Total
목록Effective c++ (54)
스토리텔링 개발자
항목 31 : 파일 사이의 컴파일 의존성을 최대로 줄이자 C++ 컴파일 의존성 문제C++은 인터페이스와 구현을 깔끔하게 분리하지 못한다.구현 세부사항이 헤더에 포함되기 때문이다.구현 세부사항이란, 멤버 변수, 암시적 인라인 함수 등.#include 문을 통한 헤더 파일들 사이의 컴파일 의존성(compilation dependency)이 발생할 수 있다.구현부의 외부로 노출되지 않은 코드를 수정했음에도 건들지 않은 다른 곳까지 몽땅 컴파일 / 링크되는 상황이 발생할 수 있다.#include #include "date.h"#include "address.h"// #include 문을 통한 컴파일 의존성 발생class Person{public: Person(const string& name, cons..
항목 30. 인라인 함수는 미주알 고주알 따져서 이해해 두자. 인라인 함수함수처럼 보이고, 함수처럼 동작하고, 매크로보다 훨씬 안전하고 쓰기 좋다.(항목 2 참조)함수 호출 비용이 면제된다.(함수 호출 시 발생하는 오버헤드 걱정이 없다.)컴파일러가 함수 본문에 대해 문맥별(context-specific) 최적화를 해줄 여지가 높아진다.대체적으로 컴파일러 최적화는 함수 호출이 없는 코드가 연속적으로 이어지는 구간에 적용되도록 설계된다.인라인 함수는 함수 호출이 없는 것과 마찬가지로 인식되므로 최적화될 확률이 높다.실제로 대부분의 컴파일러는 아웃라인(outline) 함수 호출(일반적인 함수 호출)에 대해서는 이런 최적화를 적용하지 않는다. 인라인 함수와 프로그램 크기인라인 함수 아이디어는 함수 호출문..
항목 29 : 예외 안전성이 확보되는 그날을 위해 싸우고 또 싸우자! 예외 안정성을 고려하지 않은 코드class PrettyMenu{public: ... void changeBackground(istream& imgSrc); // 배경 그림을 바꾸는 함수 ...private: Mutex mutex; Image* bgImage; int imageChanges;};void PrettyMenu::changeBackground(istream& imgSrc){ lock(&mutex); delete bgImage; ++imageChanges; bgImage = new Image(imgSrc); unlock(&mutex);} 예외..
항목 28. 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자. 참조자 반환 함수에 대한 고찰메모리 부담을 최대한 줄이기 위해 실 데이터를 가리키는 포인터를 가지고 있는 사각형 클래스를 만든다.class Point{public: Point(int x, int y); ... void setX(int newVal); void setY(int newVal); ...};class RectData{ Point ulhc; // 좌측 상단 Point lrhc; // 우측 하단};class Rectangle { public: .... // 참조자 형태로 꼭지점 정보를 반환한다. Point& upperLeft() const { ..
항목 27 : 캐스팅은 절약, 또 절약! 잊지 말자 C++의 동작 규칙어떤 일이 있어도 타입 에러가 생기지 않도록 보장한다.즉, 이론적으로는 컴파일만 깔끔하게 끝나면 그 이후엔 어떤 객체에 대해서도 불안전한 연산이나 말도 안되는 연산을 수행하려 들지 않는다.허나 공교롭게도 이 타입 시스템을 우회하는 방법이 있으니, 그것이 캐스트(cast)이다. C++에서 지원하는 캐스팅 문법C 스타일 캐스트 (구형 스타일 캐스트)(T)nn을 T 타입으로 캐스팅T(n)n을 T 타입으로 캐스팅C++ 스타일 캐스트 (신형 스타일 캐스트)const_cast(n)객체의 상수성을 없애는 용도로 사용된다.상수성을 없애는 기능을 가진 캐스트는 이것 뿐이다.dynamic_cast(n)안전한 다운 캐스팅을 할 때 사용하는 연산자...
항목 26 : 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 생성자, 소멸자 비용 문제생성자 / 소멸자가 있는 타입의 변수는 아래의 비용이 든다.프로그램 제어 흐름이 변수의 정의에 닿을 때 생성자가 호출되는 비용변수가 유효범위를 벗어날 때 소멸자가 호출되는 비용정의만 되고 사용되지 않은 경우에도 비용이 부과된다는 점이 문제이다.string encryptPassword(const string& password){ string encrypted; if(password.length() 생성자, 소멸자 비용 줄이기변수를 사용해야 할 때가 오기 전까지 그 변수의 정의를 늦춘다.그에 더해 변수의 초기화 인자를 획득하는 시점까지 정의를 늦춘다.string encryptPasswo..
항목 25. 예외를 던지지 않는 swap에 대한 지원도 생각해보자 swap 함수다양한 활용성예외 안전성 프로그래밍(항목 29 참조)의 감초 역할로 쓰인다.자기 대입 현상(항목 11 참조)을 대처하기 위한 대표적인 매커니즘으로 쓰인다.쓸모가 많기에 구현 방법이 중요하다.그렇다면 어떻게 만들어야 쓸만한 swap을 만들 수 있을까? STL이 제공하는 swap 함수의 구현namespade std{ template void swap(T& a, T& b) { T temp(a); a = b; b = temp; }}T 객체가 복사만 지원해준다면 정상 동작한다.호출 1번, 복사 3번이 발생한다. 복사하면 손해를 보는 타입(다른 타입의 실제 데이터를 가리..
항목 24. 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 클래스에서 암시적 타입 변환을 지원하는 것은 일반적으로 안 좋은 생각이다.다만, 숫자 타입은 C++ 기본 암시적 변환과 별반 다르지 않으므로 허용해도 좋을 것이다. 클래스 멤버 함수에서 사칙 연산 구현class Rational // 유리수 클래스{public: Rational(int numerator = 0, int denominator = 1); // explicit을 붙이지 않은 이유는 // int에서 Rational 암시적 변환을 허용하기 위함 int numerator() const; int denominator() const; public: const Rati..