more effective c++ chapter4 이후 항목 29까지

26
more Effective C++ Chapter 5 항목 29까지 ‘유용하고 재미있는 프로그래밍 기법들_1’ 131039 신동찬

Upload: dongchan-shin

Post on 23-Jun-2015

119 views

Category:

Engineering


3 download

DESCRIPTION

c++ adv 수업 과제 제출

TRANSCRIPT

Page 1: More effective c++ chapter4 이후 항목 29까지

more Effective C++ Chapter 5 항목 29까지‘유용하고 재미있는 프로그래밍 기법들_1’

131039 신동찬

Page 2: More effective c++ chapter4 이후 항목 29까지

유용하고재미있는

그리고 오래된프로그래밍 기법들

Page 3: More effective c++ chapter4 이후 항목 29까지

smart_ptrshared_ptr

이미 Effective C++에서 다루고 넘어온 친구들

특히 항목 29에서 Shared_ptr의 언급이 없음more effective c++도 개정판이 필요함...

참고 : http://www.slideshare.net/Dong-chan_Shin/effective-c-chapter3-4-33053208

Page 4: More effective c++ chapter4 이후 항목 29까지

물론 앞선 내용에서는‘tr1, boost에서 제공되는 기능을 어떻게 쓰는가?’에 초점

More Effective C++는해당 기능이 어떻게 만들어 졌는가에 대한 이야기

smart_ptrshared_ptr두 녀석의 내부 형태를 가늠할 수 있음

Page 5: More effective c++ chapter4 이후 항목 29까지

결국에는 프로그래머가 메모리에‘원하는 객체를 생성하고’‘원하는 시점에 삭제하고’‘완전히 삭제 되었다는 것을 보장하는’

기법들을 소개하는 내용이 주요 내용

주의할 점!지난 시간에도 나왔듯 일부 내용에 대해서는Trade-off를 고려해야 함

Page 6: More effective c++ chapter4 이후 항목 29까지

가상 생성자생성자에도 virtual을 붙인다?

virtual(어디서는 퍅셔미로 쓰고 있죠;;)를 어디서 봤죠?런타임시 동적 할당

가상 생성자는 생소한 표현일 수 있으나기능은 예측 가능함

‘자신이 받은 입력 데이터에 의존하여 다른 타입의 객체 생성 함수’

Page 7: More effective c++ chapter4 이후 항목 29까지

특히 잘 쓰이는 부분은

가상 복사 생성자호출 객체를 그대로 뜬 사본의 포인터를 반환(clone을 만들어 냄)

위 샘플처럼리스트 각 요소에 대해 가상 복사 생성자를 호출해text/graphic 객체에 대한 일을 처리

Page 8: More effective c++ chapter4 이후 항목 29까지

일을 하다 보면비멤버 함수도 동적 타입에 따라 다른 동작을 시키고 싶어집니다.

이럴 경우 비멤버 함수를 가상 함수화 하면 가능합니다.

class 정의시 원하는 일을 하는 가상 함수를 만들고비가상 함수에서 호출하면 가능

함수 호출 비용을 줄이기 위해 inline 함수로 처리

Page 9: More effective c++ chapter4 이후 항목 29까지

이렇게 동적 할당해서 사용하는 건 좋은데...

항상 메모리 릭은클래스 인스턴스를 할당해서 사용하다가 빠뜨리는데 시작한다

이런 자원 낭비를 막는 방법?

방법1. 클래스 인스턴스 개수를 스스로 조절하게 끔방법2. 스마트한 녀석이 되도록 함방법3. 자신을 참조 카운트를 들고 있어 메모를 통해 스스로를 조절

어떤 방법을 써서라도클래스 인스턴스를 관리 영역에 넣어보자!

Page 10: More effective c++ chapter4 이후 항목 29까지

‘객체가 생성될 수 있는 3가지 상황’을 지배하는 자가

코드코트를 지배한다

1. 자체로 생성될 때2. 파생된 객체의 기본 클래스 부분으로 만들어질 때3. 다른 객체의 클래스 멤버로 만들어질 때

우리는 쉽게 그 자체로 생성할 때즉, new만 알아서 적절히 통제하면 되겠지...

당연히 그렇지 않다

Page 11: More effective c++ chapter4 이후 항목 29까지

프린트 클래스를 예로 들면

Printer의 기본 생성자를 private로 묶어 함부로 생성할 수 없게 제한Printer객체를 함수의 정적 객체로 만들어 함수 호출로 객체 생성

Page 12: More effective c++ chapter4 이후 항목 29까지

개수를 컨트롤 하는 방법은

개수에 따라 발생하는 예외 클래스를 생성예외 클래스에 따라 해당 내용을 처리하도록 함

numObjects의 숫자를 변경함으로서 객체 개수도 제어

Page 13: More effective c++ chapter4 이후 항목 29까지

현재 상태는 본인이 몇 개를 생성했는지는 알 수 없고다만 결정된 개수보다 많으면 예외가 나오는 형태

당연히 인스턴스 카운팅 기능을 달아주면 기능이 확장 된다

쉬운 방법은 상위 카운팅 클래스를 만들어 상속하는 것이지만다양한 클래스, 그에 해당하는 별도의 카운터를 두는 것은 낭비

클래스 템플릿으로 만들어 원하는 카운터를 자동으로 만들자

Page 14: More effective c++ chapter4 이후 항목 29까지

프린터 클래스 적용 사례

클래스 템플릿을 사용하면객체 클래스에서 클래스 템플릿에서 상속 받는 기능을 신경 쓸 이유가 없음

Page 15: More effective c++ chapter4 이후 항목 29까지

이렇게 프로그래머가 생성/삭제하는 것은전부 힙(heap) 에서 생긴다고 알고 있는데

사실 항상 그렇지 않다!

모든 것이 가능한 C++에게 그런 제한은 없다

절대로 메모리 누수가 일어나지 않도록 하기 위해힙 외 공간에서 객체 생성도 가능함

특히 임베디드 시스템용 프로그램에서 빈번함

또한 앞서에서도 프린트 객체의 실체는 정적 영역에 있다

Page 16: More effective c++ chapter4 이후 항목 29까지

즉 heap과 stack만 구분하면 끝이 아니라...

정적 객체도 있음을 항상 생각해야 한다

따라서 무조건 주소 기반으로 탐색해 나가는 방법

힙 영역에 잘 안착했는지 찾기 위해서라면,완전 무의미한 방법이다

그 구분에 대한 인식을 확실히 하자

Page 17: More effective c++ chapter4 이후 항목 29까지

객체를 힙에 할당하지 않는 방법은?

힙은 new를 통하지 않으면 안 됨이미 앞선 코드에 나왔듯, private 등으로 new 사용을 막아버리면 됨

객체가 힙에 있을 때 예외를 일으키는 방법은?

없다컴파일러 특성 등에 따라 그때그때 다른 결과가 나오기 때문

Page 18: More effective c++ chapter4 이후 항목 29까지

스마트 포인터(smart_ptr)effective C++ 자원 부분에서 수없이 등장했었다

• 생성과 소멸 작업을 조절• 복사와 대입 동작 조절• 역참조 동작 조절

우리가 봤던 smart_ptr은어디서 참조하든 혼자만 오롯한 포인터(이전 참조 삭제)

즉 More effective c++에서 제시하는 조절을 적절히 반영함

Page 19: More effective c++ chapter4 이후 항목 29까지

대입흔히 복사가 일어나는데 반해스마트 포인터에서는 단순하지 않습니다

대입은 소유권을 이전하는 것

특정 객체의 소유권을 가지고 있다고 생각

따라서새로운 객체가 대입되는 경우기존에 가지고 있던 객체를 반드시 삭제해야 함

Page 20: More effective c++ chapter4 이후 항목 29까지

스마트 포인터와 상속타입 변환이 항상 가능한가?

1단계만 상속한 경우 가능한 것 처럼 구현할 수 있으나,결론적으로 불가능 함

스마트 포인터에서는 멤버 함수를 써서 타입변환을 수행

C++ 컴파일러는 모호함을 극복하지 못하고 에러 발생

일일이 캐스팅을 해줘야 함

Page 21: More effective c++ chapter4 이후 항목 29까지

스마트 포인터

역시 ‘만능은 없다’를 증명

• null 확인• 벙어리 포인터로의 변환• 상속 깁낭의 변환• 상수객체에 대한 포인터 지원

이런 데서 스마트 포인터의 사용은 악

Page 22: More effective c++ chapter4 이후 항목 29까지

C++는 왜!메모리를 알아서 해주는 가비지 컬렉터가 없는가?!

참조 포인터를 사용하면 유사하게 사용은 가능!

객체의 소유권 추적똑같은 값을 가지고 있는 객체의 반복 양산

메모리 관리에 문제가 발생할 가능성이 있음

Page 23: More effective c++ chapter4 이후 항목 29까지

사용 카운트를 둬 사용 현황을 유지함

참조 포인터의 자료구조(String의 경우)

Page 24: More effective c++ chapter4 이후 항목 29까지

와 이거 좋은데요~!그런데 왜 보기가 힘들까요?

여기서 다시 보는

Trade-off

기본적으로 추가된 객체만큼 메로리 추가 소모메모리 접근 코드 필요포인터와 관련된 모든 동작에서 참조 횟수 조작 실행

객체들 사이에서 값의 공유가 빈번하면 최적화 기법

아니라면 낭비가 됩니다

Page 25: More effective c++ chapter4 이후 항목 29까지

상대적으로 많은 객체들이 상대적으로 적은 값을 공유할 때

어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나 메모리 소모가 클 때

고려하세요 :)

Page 26: More effective c++ chapter4 이후 항목 29까지

more effective C++ 5_1