SlideShare a Scribd company logo
1 of 29
Download to read offline
모어 이펙티브 씨쁠쁠
유용하고 재미있는? 프로그래밍 기법들	

(~ 항목 29까지)
생성자 함수와 비멤버 함수를 가상 함수처럼 만드는 방법
-가상 생성자-	

자신이 받은 입력 데이터에 의존하여	

다른 타입의 객체를 생성하는 함수
가상 복사 생성자는 해당 클래스의 진짜 복사 생성자를 호출하는 것으로 끝
비멤버 함수를 가상 함수처럼 동작하게 하는 방법
원하는 일을 하는 가상 함수를 만들어 놓고,	

비가상 함수에서 호출 함수가 한번더 호출되는 비용은	

인라인 선언으로 제거
클래스 인스턴스의 개수를 의도대로 제한하는 방법
객체를 전혀 생성하지 않거나 한 개만 생성하기
특정한 클래스의 객체가 만들어지지 않게 하는	

가장 쉬운 방법은 그 클래스의 생성자를 private로 선언
생성자가 private여서 객체 생성을 할수없지만	

friend로 생성자 제한을 벗어난 상태에서	

static으로 하나를 만들고 언제든 불러서 사용
전역변수가 걱정되면	

클래스의 정적 멤버 변수로 두거나	

네임스페이스에 넣는다.
클래스의 정적 객체가 아니라 함수의 정적 개체면	

이 함수가 호출되지 않으면 객체도 만들어지지 않는다.	

!
또 클래스 정적 객체면 초기화 시점이 불명확하다.
사실 return 한줄짜리 inline과 마찬가지지만	

inline을 사용하면 정적객체가 중복으로 생길수 있으니	

정적 객체를 선언한 비멤버 함수는 inline을 호출하지 말자
하지만 요즘 컴파일러는 external연결로	

변경한다고 함…
객체를 불러냈다가 들여보내는 것도 자유롭게 하고 싶다!
생성 갯수를 제한하면서 객체를 리턴
인스턴스 카운팅(Object-Counting) 기능을 가진 기본 클래스
생성 횟수를 제한해야 하는 클래스가 많이 필요하면	

템플릿을 만들어서 원하는 개수만큼의 카운터를 자동으로 만들어 보자
힙(heap)에만 생성되거나 힙에는 만들어지지 않는	

특수한 클래스를 만드는 방법
객체가 자살(delete this)를 하게 만들려면	

꼭 힙에 할당되어야함	

!
메모리 누수를 차단하고 싶으면	

힙에 할당하지 않는것도 방법…	

!
이걸 컨트롤 할려면?
객체가 힙에만 생성되게 하기
힙으로 한정짓는 방법은 new이외의 방법으로 객체 생성을 금지시킴	

!
생성자와 소멸자로 private로 하자…	

는 너무 정도를 넘는다.	

!
생성자를 public으로 소멸자만 private로 하고	

진짜 소명자를 호출하는 유사 소멸자를 만들자.
메모리 구조를 생각해서 이런식으로 판별할 수 있지 않을까?
정적 객체를 구분 못함
그리고 저번 수업내용 처럼 저 char가 끝부분이 아닌	

다른 자리를 가리키는 일은 없을까…
new할때마다 리스트에 기록을 하고	

기록한 내용으로 검색을 한다.
객체가 힙에 생성되지 않게 하기
new를 막아버리자
스마트 포인터(Smart pointer)
스마트 포인터를 쓰는 이유
- 생성(construction)과 소멸(destruction) 작업을 조절	

리소스 누수 막고 초기화도 해준다.	

!
- 복사(copy)와 대입(assignment) 동작을 조절	

객체, 포인터 복사하던지 대입하던지 결정 가능	

!
- 역참조(dereferencing) 동작을 조절	

가져오는 방법도 결정 가능
스마트 포인터의 생성, 대입, 소멸
생성은 가리킬 객체를 하나 준비하고,	

스마트 포인터의 내부에 있는 벙어리 포인터를	

그 객체의 주소로 세팅하는것으로 끝	

!
!
그런데 그냥 벙어리 포인터에 포인터 복사하면	

삭제될때 두번삭제되는 문제 있을수 있음	

그러면 값 복사? -> 성능 저하	

!
-> 복사 대입을 못하게 하면 문제 해결	

!
->하지만 auto_ptr은 복사, 대입될때 소유 관계를 옮김	

!
-> 그러므로 값 옮기는 것을 주의
역참조(Dereferencing) 연산자 구현하기
operator*, operator-> 스마트 포인터가 가리키는 객체를 반환하는 함수	

참조자를 반환해야지 객체를 반환하면 슬라이스 문제가 발생	

null일때는 어쩔수 없음 예외처리 해야함
스마트 포인터가 null인지 점검하기
isNull같은 멤버 함수를 추가하는건 별로 스마트 해보이지 않음	

타입변환 연산자를 void*로 바꾸면 스마트 포인터가 널이면	

0을 반환하고 아니면 0이 아닌 값을 반환한다.
하지만 완전치 않음…
스마트 포인터를 벙어리 포인터로 변환하기
암시적으로 타입을 변환하는 연산자를 제공하면 되지만	

직접 벙어리 포인터를 조작하였다간 참조 카운팅에 필요한 정보가	

조정되지 않아서 두번삭제되거나 여러 문제를 일으킨다.	

-> 가능하면 하지 말자.
스마트 포인터와 상속 기반의 타입변환
상속 관계에 있어도 스마트 포인터는	

변환을 못해준다.	

!
암시적 타입 연산자를 만들까?	

-> 템플릿의 철학과 다르다	

-> 클래스 계통 구조가 깊으면	

더 많은 변환 연산자 추가해야함	

!
암시적 변환 연산자를 만드는	

템플릿을 만들자 -> 가독성이…
스마트 포인터
스마트 포인터 쓸려면 신경써야 하는 경우가 많음	

널 점검이나 벙어리 포인터로의 변환,	

상속 기반의 변환, 상수 객체에 대한 포인터 지원등의 상황에서는	

스마트 포인터 사용을 제한해야함	

!
구현도 힘들고 이해하기도 힘들고 유지보수도 힘들다	

디버깅도 훨씬 힘들어 진다.	

!
하지만 참조 카운팅 코드에서는 스마트 포인터를 사용하면	

상당히 단순해 진다던지 다른 방법으론 구현하기 힘든 기능을	

구사하는데 효과적이다.
참조 카운팅(Reference Counting)
여러 개의 객체들이 똑같은 값을 가졌으면,	

그 객체들로 하여금 그 값을 나타내는 하나의 데이터를 공유하게 해서	

데이터의 양을 절약하는 기법	

!
-힙 객체를 둘러싼 내부 정보를 유지하는 작업을 단순하게 하자	

-똑같은 값을 가지고 있는 객체들이 그 중복을 놔두는 것은 낭비
하지만 소멸은?
참조 횟수를 기록하고 있다가	

0이되면 삭제해서 메모리 누수를 막자	

!
사용 카운트(use count)라고 부르기도 함
대입시에는 참조 카운트를 늘리고	

동일한 것을 반환하고	

카운트가 0이면 삭제
기록시점 복사(Copy-on-Write)
공유중이던 것을 하나가 수정이 되어야 할 때에는	

다른 공유되어있는 애한테 영향이 가지 않토록	

사본을 만들어서 반환을 한다.
포인터, 참조자, 그리고 기록시점 복사
? ? ?
양쪽다 값이 변경됨…	

이렇게 되도록 구현된 경우가 많음
공유 가능성(shareability)을 나타내는 플래그를 넣어	

객체가 공유가능 여부를 나타내고	

operator[]가 불리면 false로 바꾸어서 공유 불가능으로 만든다.
참조 카운팅 기능을 가진 기본 클래스
기존의 클래스에 상속을 받는 것으로 참조 카운트 기능을 넣자.
-기능-	

참조 추가(카운트 증가)	

참조 제거(카운트 감소)	

참조 가능성 플래그로 플래그 조회나 비활성화
참조 카운트 조작을 자동화하기
앞의 RCObject에는 참조 카운트를 저장할 수 있는 공간과	

참조카운트를 조작할 수 있는 멤버 함수가 있는데	

이 함수는 직접 호출해 주어야 하니 이런 호출 코드도	

재사용 가능한 클래스에게 몰아줘보자.
값이 다르면 기존의 값을 저장하고	

공유나 사본을 만들고	

참조 제거
소멸자는 그냥 참조 제거
참조 카운팅 결론
좋아 보이지만 결국 어느 상황에 적합하냐가 중요	

매번 카운트를 제어하고 보관하는 비용도 추가로 들고	

코드도 복잡하게 된다. -> 유지보수 헬	

자기 참조형(self-referential) 혹은	

원형 의존형 (circular dependency)구조 (트리 등)에서는	

적용이 힘들다.	

!
하지만	

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

어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나	

메모리 소모가 클때 큰 효과를 발휘한다.	

그리고 생성 소멸을 덜 신경써도 되어서 편하다.	

!
그리고 이 조건에 만족하는지 판단하는 방법은 프로파일링

More Related Content

What's hot

More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3현찬 양
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
M5 6 1
M5 6 1M5 6 1
M5 6 1nexthw
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2현찬 양
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2Injae Lee
 
More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지Dong Chan Shin
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1현찬 양
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2세빈 정
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디quxn6
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1현찬 양
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1연우 김
 
python 클래스 생성자
python 클래스 생성자python 클래스 생성자
python 클래스 생성자Gyu Hyeon Kim
 
모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6quxn6
 
비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1민태 김
 

What's hot (20)

More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
M5 6 1
M5 6 1M5 6 1
M5 6 1
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
 
5 6 1
5 6 15 6 1
5 6 1
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
python 클래스 생성자
python 클래스 생성자python 클래스 생성자
python 클래스 생성자
 
모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6
 
비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1
 

Similar to M5 1 1

Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummarySeungYeonChoi10
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object민태 김
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7Yeonah Ki
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4Dong Chan Shin
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3성연 김
 
M3 4 1
M3 4 1M3 4 1
M3 4 1nexthw
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2성연 김
 
You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2Kiwoong Kwon
 

Similar to M5 1 1 (20)

Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
3 4 1
3 4 13 4 1
3 4 1
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4
 
1 2 1
1 2 11 2 1
1 2 1
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3
 
M3 4 1
M3 4 1M3 4 1
M3 4 1
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2You don't know JS / this / chapter 1-2
You don't know JS / this / chapter 1-2
 

M5 1 1

  • 1. 모어 이펙티브 씨쁠쁠 유용하고 재미있는? 프로그래밍 기법들 (~ 항목 29까지)
  • 2. 생성자 함수와 비멤버 함수를 가상 함수처럼 만드는 방법 -가상 생성자- 자신이 받은 입력 데이터에 의존하여 다른 타입의 객체를 생성하는 함수 가상 복사 생성자는 해당 클래스의 진짜 복사 생성자를 호출하는 것으로 끝
  • 3. 비멤버 함수를 가상 함수처럼 동작하게 하는 방법 원하는 일을 하는 가상 함수를 만들어 놓고, 비가상 함수에서 호출 함수가 한번더 호출되는 비용은 인라인 선언으로 제거
  • 4. 클래스 인스턴스의 개수를 의도대로 제한하는 방법 객체를 전혀 생성하지 않거나 한 개만 생성하기 특정한 클래스의 객체가 만들어지지 않게 하는 가장 쉬운 방법은 그 클래스의 생성자를 private로 선언
  • 5. 생성자가 private여서 객체 생성을 할수없지만 friend로 생성자 제한을 벗어난 상태에서 static으로 하나를 만들고 언제든 불러서 사용 전역변수가 걱정되면 클래스의 정적 멤버 변수로 두거나 네임스페이스에 넣는다.
  • 6. 클래스의 정적 객체가 아니라 함수의 정적 개체면 이 함수가 호출되지 않으면 객체도 만들어지지 않는다. ! 또 클래스 정적 객체면 초기화 시점이 불명확하다.
  • 7. 사실 return 한줄짜리 inline과 마찬가지지만 inline을 사용하면 정적객체가 중복으로 생길수 있으니 정적 객체를 선언한 비멤버 함수는 inline을 호출하지 말자 하지만 요즘 컴파일러는 external연결로 변경한다고 함…
  • 8. 객체를 불러냈다가 들여보내는 것도 자유롭게 하고 싶다! 생성 갯수를 제한하면서 객체를 리턴
  • 9. 인스턴스 카운팅(Object-Counting) 기능을 가진 기본 클래스 생성 횟수를 제한해야 하는 클래스가 많이 필요하면 템플릿을 만들어서 원하는 개수만큼의 카운터를 자동으로 만들어 보자
  • 10. 힙(heap)에만 생성되거나 힙에는 만들어지지 않는 특수한 클래스를 만드는 방법 객체가 자살(delete this)를 하게 만들려면 꼭 힙에 할당되어야함 ! 메모리 누수를 차단하고 싶으면 힙에 할당하지 않는것도 방법… ! 이걸 컨트롤 할려면?
  • 11. 객체가 힙에만 생성되게 하기 힙으로 한정짓는 방법은 new이외의 방법으로 객체 생성을 금지시킴 ! 생성자와 소멸자로 private로 하자… 는 너무 정도를 넘는다. ! 생성자를 public으로 소멸자만 private로 하고 진짜 소명자를 호출하는 유사 소멸자를 만들자.
  • 12. 메모리 구조를 생각해서 이런식으로 판별할 수 있지 않을까?
  • 13. 정적 객체를 구분 못함 그리고 저번 수업내용 처럼 저 char가 끝부분이 아닌 다른 자리를 가리키는 일은 없을까…
  • 14. new할때마다 리스트에 기록을 하고 기록한 내용으로 검색을 한다.
  • 15. 객체가 힙에 생성되지 않게 하기 new를 막아버리자
  • 16. 스마트 포인터(Smart pointer) 스마트 포인터를 쓰는 이유 - 생성(construction)과 소멸(destruction) 작업을 조절 리소스 누수 막고 초기화도 해준다. ! - 복사(copy)와 대입(assignment) 동작을 조절 객체, 포인터 복사하던지 대입하던지 결정 가능 ! - 역참조(dereferencing) 동작을 조절 가져오는 방법도 결정 가능
  • 17. 스마트 포인터의 생성, 대입, 소멸 생성은 가리킬 객체를 하나 준비하고, 스마트 포인터의 내부에 있는 벙어리 포인터를 그 객체의 주소로 세팅하는것으로 끝 ! ! 그런데 그냥 벙어리 포인터에 포인터 복사하면 삭제될때 두번삭제되는 문제 있을수 있음 그러면 값 복사? -> 성능 저하 ! -> 복사 대입을 못하게 하면 문제 해결 ! ->하지만 auto_ptr은 복사, 대입될때 소유 관계를 옮김 ! -> 그러므로 값 옮기는 것을 주의
  • 18. 역참조(Dereferencing) 연산자 구현하기 operator*, operator-> 스마트 포인터가 가리키는 객체를 반환하는 함수 참조자를 반환해야지 객체를 반환하면 슬라이스 문제가 발생 null일때는 어쩔수 없음 예외처리 해야함 스마트 포인터가 null인지 점검하기 isNull같은 멤버 함수를 추가하는건 별로 스마트 해보이지 않음 타입변환 연산자를 void*로 바꾸면 스마트 포인터가 널이면 0을 반환하고 아니면 0이 아닌 값을 반환한다. 하지만 완전치 않음…
  • 19. 스마트 포인터를 벙어리 포인터로 변환하기 암시적으로 타입을 변환하는 연산자를 제공하면 되지만 직접 벙어리 포인터를 조작하였다간 참조 카운팅에 필요한 정보가 조정되지 않아서 두번삭제되거나 여러 문제를 일으킨다. -> 가능하면 하지 말자. 스마트 포인터와 상속 기반의 타입변환 상속 관계에 있어도 스마트 포인터는 변환을 못해준다. ! 암시적 타입 연산자를 만들까? -> 템플릿의 철학과 다르다 -> 클래스 계통 구조가 깊으면 더 많은 변환 연산자 추가해야함 ! 암시적 변환 연산자를 만드는 템플릿을 만들자 -> 가독성이…
  • 20. 스마트 포인터 스마트 포인터 쓸려면 신경써야 하는 경우가 많음 널 점검이나 벙어리 포인터로의 변환, 상속 기반의 변환, 상수 객체에 대한 포인터 지원등의 상황에서는 스마트 포인터 사용을 제한해야함 ! 구현도 힘들고 이해하기도 힘들고 유지보수도 힘들다 디버깅도 훨씬 힘들어 진다. ! 하지만 참조 카운팅 코드에서는 스마트 포인터를 사용하면 상당히 단순해 진다던지 다른 방법으론 구현하기 힘든 기능을 구사하는데 효과적이다.
  • 21. 참조 카운팅(Reference Counting) 여러 개의 객체들이 똑같은 값을 가졌으면, 그 객체들로 하여금 그 값을 나타내는 하나의 데이터를 공유하게 해서 데이터의 양을 절약하는 기법 ! -힙 객체를 둘러싼 내부 정보를 유지하는 작업을 단순하게 하자 -똑같은 값을 가지고 있는 객체들이 그 중복을 놔두는 것은 낭비 하지만 소멸은?
  • 22. 참조 횟수를 기록하고 있다가 0이되면 삭제해서 메모리 누수를 막자 ! 사용 카운트(use count)라고 부르기도 함
  • 23. 대입시에는 참조 카운트를 늘리고 동일한 것을 반환하고 카운트가 0이면 삭제
  • 24. 기록시점 복사(Copy-on-Write) 공유중이던 것을 하나가 수정이 되어야 할 때에는 다른 공유되어있는 애한테 영향이 가지 않토록 사본을 만들어서 반환을 한다.
  • 25. 포인터, 참조자, 그리고 기록시점 복사 ? ? ? 양쪽다 값이 변경됨… 이렇게 되도록 구현된 경우가 많음
  • 26. 공유 가능성(shareability)을 나타내는 플래그를 넣어 객체가 공유가능 여부를 나타내고 operator[]가 불리면 false로 바꾸어서 공유 불가능으로 만든다.
  • 27. 참조 카운팅 기능을 가진 기본 클래스 기존의 클래스에 상속을 받는 것으로 참조 카운트 기능을 넣자. -기능- 참조 추가(카운트 증가) 참조 제거(카운트 감소) 참조 가능성 플래그로 플래그 조회나 비활성화
  • 28. 참조 카운트 조작을 자동화하기 앞의 RCObject에는 참조 카운트를 저장할 수 있는 공간과 참조카운트를 조작할 수 있는 멤버 함수가 있는데 이 함수는 직접 호출해 주어야 하니 이런 호출 코드도 재사용 가능한 클래스에게 몰아줘보자. 값이 다르면 기존의 값을 저장하고 공유나 사본을 만들고 참조 제거 소멸자는 그냥 참조 제거
  • 29. 참조 카운팅 결론 좋아 보이지만 결국 어느 상황에 적합하냐가 중요 매번 카운트를 제어하고 보관하는 비용도 추가로 들고 코드도 복잡하게 된다. -> 유지보수 헬 자기 참조형(self-referential) 혹은 원형 의존형 (circular dependency)구조 (트리 등)에서는 적용이 힘들다. ! 하지만 상대적으로 많은 객체들이 상대적으로 적은 값을 공유할 때, 어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나 메모리 소모가 클때 큰 효과를 발휘한다. 그리고 생성 소멸을 덜 신경써도 되어서 편하다. ! 그리고 이 조건에 만족하는지 판단하는 방법은 프로파일링