Pimpl 의 주요 단점은 항당 new 를 이용하여, 생성하고 delete를 이용하여 해제하는 과정을 겪어야 한다는 점이다. 보다 안전하고 보다 빠르게 사용 할수 있을까? ... 아래 3가지 시도를 우선 보도록 하자. /* 시도 1 */ // file y.h #include "x.h" class Y { /* ... */ X x_; }; // file y.cpp Y::Y() { } 역시 이 시도1로 하면 Pimpl의 비용을 전혀 내지 않지만, Pimpl 은 쓰지 않으니 .. 한번 사용해 보도록 하자. /* 시도 2 */ // file y.h class X; class Y { /* ... */ X* px_; }; // file y.cpp #include "x.h" Y::Y() : px_( new X ) { ..
책 정리/Exceptional C++ 검색 결과
항목 27에서 Pimpl 이디엄을 사용하여, 컴파일 타임 상호 의존성을 매우 줄였다. 하지만 Pimpl 을 어떻게 짜야만 더 좋고 안전하게 만들 수 있는지에 대해서는 무시하고 진행 했었다. 그런데.. 생뚱맞게 왜 항목이 "컴파일 방화벽" 이라는 말이 나왔지? 곰곰해 생각해 보면 Pimpl 이디엄은 그 컴파일러 입장에서 보면, 보이지 않는 벽같은 것이라 할 수도 있겠다. 음~ 본론으로 들어와서, 어떻게 만드는 것이 가장 좋을까? 크게 몇가지 규칙을 적어 본다. 모든 private 데이터를 XImpl에 넣는다.(함수는 제외) 모든 private 멤버들을 XImpl에 넣는다. 모든 Private와 Protected 멤버들을 XImpl 에 넣는다. XImpl을 전체적으로 X가 가지고 있는 클래스로 만들고, X를..
파트 1 ~ 2 까지 하면서 믿을 수 없게, 컴파일 의존성을 줄였다. 다음 코드는 파트 2 까지 정리된 코드이다. /* x.h : 원본 헤더, 컴파일 의존성 줄이기 위해 Pimple 적용된 모습 */ #include // 포워드 헤더 포함 #include "a.h" #include "b.h" class X : public A, private B { public: class C; // 포워드 선언 사용 X( const C& ); B f( int, char* ); C f( int, C ); C& g( B ); class E; // 포워드 선언 사용 E h( E ); virtual std::ostream& print( std::ostream& ) const; private: struct XImpl; XImpl..
파트 1에서 불 필요한 헤더를 제거하고 수정했다면, 파트2에선 기본 하는 일을 제외하고, 컴파일 의존성을 좀 주려 보자. 예제 코드 /* x.h : 원본 헤더 */ // #include 없어도 됨 // #include #include // 포워드 헤더 포함 #include #include "a.h" #include "b.h" #include "c.h" #include "d.h" // #include "e.h" class X : public A, private B { public: X( const C& ); B f( int, char* ); C f( int, C ); C& g( B ); class E; // 포워드 선언 사용 E h( E ); virtual std::ostream& print( std::o..
컴파일 시간을 줄이기 위한 그 첫번째 단계는 "불필요한 헤더 파일을 제거해야 한다" 부터 시작 된다. 왜냐하면 많은 헤더파일 포함은 그에 비례한 시간을 컴파일러에게 주어야 하기 때문이다. 그렇다면, 어떤 헤더 파일을 제거해도 되는지 아래 코드를 보자. /* x.h : 원본 헤더 */ #include #include #include /* A, B, C, D 혹은 E 모두 템플릿이 아니다. 단지 A와 C만 가상 함수들을 가지고 있다. */ #include "a.h" #include "b.h" #include "c.h" #include "d.h" #include "e.h" class X : public A, private B { public: X( const C& ); B f( int, char* ); C f..
다음 문제의 미묘한 문제를 지적해보자. ① 이름 은폐(name hiding)는 무엇인가? 파생된 클래스에서 기반 클래스 이름의 가시성에 어떻게 영향을 주는지 밝혀라 ② 다음 예제가 정확하게 컴파일 되는가? 가능한 좋은 답변을 달아보고, 의심 되는 부분을 고립시킨 후 설명해 봐라. namespace N { class C { /* 어쩌구 저쩌구 */ }; } int operator+( int i, N::C ) { return i + 1; } #include int main( void ) { N::C a[10]; std::accumulate( a, a+10, 0 ); } 분석 ① 가상 함수가 아니면 이름을 절대 가리지 말라고, Effective C++ 에서 설명하고 있었고, 역시 이 부분에 대해서 자세히 언급..
최근댓글