Effective C++ 때부터 가이드라인형식으로 저자가 집필했다면 이 장에서는 좀 색다른 기법들을 배운다. 난 기법보다는 기교라고 불루는데, 감탄이 절로 나오는게 많기 때문이다. 1. 생성자 함수와 비멤버 함수를 가상 함수처럼 동작하는 방법 2. 클래스의 객체의 개수를 제한하는 방법 3. 객체가 힙에서만 만들어 지는 방법 4. 3번의 반대로 힙에서는 못만들어 지게 하는 방법 5. 다른 클래스의 멤버 함수가 호출될 때마다 특정한 동작을 수행하는 객체를 만드는 방법 6. 여러 객체가 하나의 자료구조를 궁유하도록 하되 사용자 쪽에서는 객체 하나마다 자료구조가 하나씩 있는것처럼 보이게 하는 방법; 7. operator[]의 읽기와 쓰기 기능을 구별하는 방법 8. 둘 이상의 객체의 독적 타입에 맞추어 동작하는 ..
MEC++ 검색 결과
부재 : virtual 의 비용은 얼마인가? 이유 1. 구현에 따라 가상 함수(virtual function)가 성능에 영향을 미치기 때문이다. 구현방법 : 구현 방법은 없으며 개념 정리된 부분을 이해 하고 있어야 한다. 개념 정리 1. 가상 함수를 사용하면 가상 테이블(virtual table)과 가상 테이블 포인터(virtual table pointer)가 생긴다. (객체의 한쪽에 vtbl 을 가르키는 vptr이 만들어 진다) 2. 구현 방법에 따라 이 vtbl은 객체의 크기와 멤버 함수가 실행될 때의 속도에 영향을 끼친다. 3. 가상함수는 인라인 효과를 얻을 수 없다. 4. 가상상속(다이아몬드 상속을 피하기 위해)을 하면, 가상 기본 클래스의 포인터도 객체에 포함되어 덩치가 커진다. 5. RTTI는..
부재 : 단독 연산자 보단 =이 붙은 연산자가 대체적으로 효율적이였다! 이유 1. 일반적으로 대입 형태 연산자는 단독 혀애 연산자보다 효율적이다. 왜냐하면, 단독 형태 연산자는 새 객체를 반환하는 형식으로 만들어야 하지만, 대입 형태 연산자는 왼쪽 인자에다가 처리 결과를 기록하기 때문에, 이 연산자의 반환값을 담을 임시 객체를 만들어 놓을 필요가 없기 때문이다. 2. 포인터는 대입 형태 연산자와 단독 형태 연산자를 동시에 제공함으로써 클래스 사용자에게 효율과 편리성을 경우에 따라 저울질할 기회를 줄수 있다는 것 예) result = a + b + c+ d; // 세 개의 임시 객체가 사용되는데 임시 객체 하나마다 operator+가 호출된다. Or result = a; // 임시 객체가 필요 없다. re..
부재 : 임시객체 생성을 줄여 보자. 이유 1.묵시적 타입변환으로 임시객체가 만들어 지어, 자원 낭비가 되기 때문이다. 구현방법 1. 오버로딩을 하여, 임시객체가 생성되는것을 막는다. (생성자가 묵시적 타입변환으로 임시객체가 생성되는 조건에 대해서 알고 있어야 한다.) 주의점 1. 불필요한 오버로딩은 오히려 더 나쁘다. 참조 1. 오버로딩되는 연산자 함수는 반드시 최소한 한 개의 사용자 정의타입을 매개변수로 해야 한다. 개인적인 생각 1. 편역자는 암시적 타입변환이라 하지만 나같은 경우에는 묵시적 타입변환으로 말하는게 좋을것 같다. 컴파일러 입장에선 암시적이다. 컴파일러는 사용자가 그렇게 시킨것이라고 암시적으로 알렸다고 판단하기 때문이다. 하지만 사용자는 컴파일러가 자신에게 말하지도 않고 형변환을 시켜준..
부재 : 반환값의 거품을 빼자. 이유 1. 객체의 값으로 반환하는 함수에 대해서 값에 의한 반환은 막을수가 없기 때문에 2. 참조자에 의한 반환값은 별도의 주의가 너무 필요하기 때문에(물론 아닌것도 있지만) 구현 방법 1. 컴파일러가 반환값을 최적화 하게 만들자. (반환값 최적화(return value optimization : RVO) 라고 컴파일러가 분명히 지원한다) 세부 구현 방법 1. 값을 반환하는 함수에서 임시객체로 반환을 하게 만들면 된다. 코드 const Rational operator *(const Ratioal& lhs, const Ratioal& rhs) { return Rational(생성자 호출 인자를 넣어 준다); }경우에 따라 inlie 화를 시켜 줄수도 있다.
최근댓글