SlideShare a Scribd company logo
1 of 26
Download to read offline
more Effective C++
Chapter 5 항목 29까지
‘유용하고 재미있는 프로그래밍 기법들_1’
131039 신동찬
유용하고
재미있는
그리고 오래된
프로그래밍 기법들
smart_ptr
shared_ptr
이미 Effective C++에서 다루고 넘어온 친구들
특히 항목 29에서 Shared_ptr의 언급이 없음
 more effective c++도 개정판이 필요함...
참고 : http://www.slideshare.net/Dong-chan_Shin/effective-c-chapter3-4-33053208
물론 앞선 내용에서는
‘tr1, boost에서 제공되는 기능을 어떻게 쓰는가?’에 초점
More Effective C++는
해당 기능이 어떻게 만들어 졌는가에 대한 이야기
smart_ptr
shared_ptr
두 녀석의 내부 형태를 가늠할 수 있음
결국에는 프로그래머가 메모리에
‘원하는 객체를 생성하고’
‘원하는 시점에 삭제하고’
‘완전히 삭제 되었다는 것을 보장하는’
기법들을 소개하는 내용이 주요 내용
주의할 점!
지난 시간에도 나왔듯 일부 내용에 대해서는
Trade-off를 고려해야 함
가상 생성자
생성자에도 virtual을 붙인다?
virtual(어디서는 퍅셔미로 쓰고 있죠;;)를 어디서 봤죠?
런타임시 동적 할당
가상 생성자는 생소한 표현일 수 있으나
기능은 예측 가능함
‘자신이 받은 입력 데이터에 의존하여 다른 타입의 객체 생성 함수’
특히 잘 쓰이는 부분은
가상 복사 생성자
호출 객체를 그대로 뜬 사본의 포인터를 반환
(clone을 만들어 냄)
위 샘플처럼
리스트 각 요소에 대해 가상 복사 생성자를 호출해
text/graphic 객체에 대한 일을 처리
일을 하다 보면
비멤버 함수도 동적 타입에 따라 다른 동작을 시키고 싶어집니다.
이럴 경우 비멤버 함수를 가상 함수화 하면 가능합니다.
class 정의시 원하는 일을 하는 가상 함수를 만들고
비가상 함수에서 호출하면 가능
함수 호출 비용을 줄이기 위해 inline 함수로 처리
이렇게 동적 할당해서 사용하는 건 좋은데...
항상 메모리 릭은
클래스 인스턴스를 할당해서 사용하다가 빠뜨리는데 시작한다
이런 자원 낭비를 막는 방법?
방법1. 클래스 인스턴스 개수를 스스로 조절하게 끔
방법2. 스마트한 녀석이 되도록 함
방법3. 자신을 참조 카운트를 들고 있어 메모를 통해 스스로를 조절
어떤 방법을 써서라도
클래스 인스턴스를 관리 영역에 넣어보자!
‘객체가 생성될 수 있는 3가지 상황’을 지배하는 자가
코드코트를 지배한다
1. 자체로 생성될 때
2. 파생된 객체의 기본 클래스 부분으로 만들어질 때
3. 다른 객체의 클래스 멤버로 만들어질 때
우리는 쉽게 그 자체로 생성할 때
즉, new만 알아서 적절히 통제하면 되겠지...
당연히 그렇지 않다
프린트 클래스를 예로 들면
Printer의 기본 생성자를 private로 묶어 함부로 생성할 수 없게 제한
Printer객체를 함수의 정적 객체로 만들어 함수 호출로 객체 생성
개수를 컨트롤 하는 방법은
개수에 따라 발생하는 예외 클래스를 생성
예외 클래스에 따라 해당 내용을 처리하도록 함
numObjects의 숫자를 변경함으로서 객체 개수도 제어
현재 상태는 본인이 몇 개를 생성했는지는 알 수 없고
다만 결정된 개수보다 많으면 예외가 나오는 형태
당연히 인스턴스 카운팅 기능을 달아주면 기능이 확장 된다
쉬운 방법은 상위 카운팅 클래스를 만들어 상속하는 것이지만
다양한 클래스, 그에 해당하는 별도의 카운터를 두는 것은 낭비
클래스 템플릿으로 만들어 원하는 카운터를 자동으로 만들자
프린터 클래스 적용 사례
클래스 템플릿을 사용하면
객체 클래스에서 클래스 템플릿에서 상속 받는 기능을 신경 쓸 이유가 없음
이렇게 프로그래머가 생성/삭제하는 것은
전부 힙(heap) 에서 생긴다고 알고 있는데
사실 항상 그렇지 않다!
모든 것이 가능한 C++에게 그런 제한은 없다
절대로 메모리 누수가 일어나지 않도록 하기 위해
힙 외 공간에서 객체 생성도 가능함
특히 임베디드 시스템용 프로그램에서 빈번함
또한 앞서에서도 프린트 객체의 실체는 정적 영역에 있다
즉 heap과 stack만 구분하면 끝이 아니라...
정적 객체도 있음을 항상 생각해야 한다
따라서 무조건 주소 기반으로 탐색해 나가는 방법
힙 영역에 잘 안착했는지 찾기 위해서라면,
완전 무의미한 방법이다
그 구분에 대한 인식을 확실히 하자
객체를 힙에 할당하지 않는 방법은?
힙은 new를 통하지 않으면 안 됨
이미 앞선 코드에 나왔듯, private 등으로 new 사용을 막아버리면 됨
객체가 힙에 있을 때 예외를 일으키는 방법은?
없다
컴파일러 특성 등에 따라 그때그때 다른 결과가 나오기 때문
스마트 포인터(smart_ptr)
effective C++ 자원 부분에서 수없이 등장했었다
• 생성과 소멸 작업을 조절
• 복사와 대입 동작 조절
• 역참조 동작 조절
우리가 봤던 smart_ptr은
어디서 참조하든 혼자만 오롯한 포인터
(이전 참조 삭제)
즉 More effective c++에서 제시하는 조절을 적절히 반영함
대입
흔히 복사가 일어나는데 반해
스마트 포인터에서는 단순하지 않습니다
대입은 소유권을 이전하는 것
특정 객체의 소유권을 가지고 있다고 생각
따라서
새로운 객체가 대입되는 경우
기존에 가지고 있던 객체를 반드시 삭제해야 함
스마트 포인터와 상속타입 변환이 항상 가능한가?
1단계만 상속한 경우 가능한 것 처럼 구현할 수 있으나,
결론적으로 불가능 함
스마트 포인터에서는 멤버 함수를 써서 타입변환을 수행
C++ 컴파일러는 모호함을 극복하지 못하고 에러 발생
일일이 캐스팅을 해줘야 함
스마트 포인터
역시 ‘만능은 없다’를 증명
• null 확인
• 벙어리 포인터로의 변환
• 상속 깁낭의 변환
• 상수객체에 대한 포인터 지원
이런 데서 스마트 포인터의 사용은 악
C++는 왜!
메모리를 알아서 해주는 가비지 컬렉터가 없는가?!
참조 포인터를 사용하면 유사하게 사용은 가능!
객체의 소유권 추적
똑같은 값을 가지고 있는 객체의 반복 양산
메모리 관리에 문제가 발생할 가능성이 있음
사용 카운트를 둬 사용 현황을 유지함
참조 포인터의 자료구조(String의 경우)
와 이거 좋은데요~!
그런데 왜 보기가 힘들까요?
여기서 다시 보는
Trade-off
기본적으로 추가된 객체만큼 메로리 추가 소모
메모리 접근 코드 필요
포인터와 관련된 모든 동작에서 참조 횟수 조작 실행
객체들 사이에서 값의 공유가 빈번하면 최적화 기법
아니라면 낭비가 됩니다
상대적으로 많은 객체들이 상대적으로 적은 값을 공유할 때
어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나 메모리 소모가 클 때
고려하세요 :)
more effective C++ 5_1

More Related Content

What's hot

Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2Injae Lee
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1현찬 양
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3현찬 양
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4Dong Chan Shin
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1현찬 양
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview민태 김
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1민태 김
 
C++ try catch 어디까지 가봤니
C++ try catch 어디까지 가봤니C++ try catch 어디까지 가봤니
C++ try catch 어디까지 가봤니Dong Chan Shin
 
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자민욱 이
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4성연 김
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향QooJuice
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8성연 김
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디quxn6
 

What's hot (20)

MEC++ 3,4
MEC++ 3,4MEC++ 3,4
MEC++ 3,4
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1비개발자를 위한 Javascript 알아가기 #5.1
비개발자를 위한 Javascript 알아가기 #5.1
 
7 8 1
7 8 17 8 1
7 8 1
 
C++ try catch 어디까지 가봤니
C++ try catch 어디까지 가봤니C++ try catch 어디까지 가봤니
C++ try catch 어디까지 가봤니
 
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 

Similar to More effective c++ chapter4 이후 항목 29까지

Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
M5 1 1
M5 1 1M5 1 1
M5 1 1nexthw
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2성연 김
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptInjae Lee
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3성연 김
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummarySeungYeonChoi10
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong 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
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2세빈 정
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++KyeongWon Koo
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차Injae Lee
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 

Similar to More effective c++ chapter4 이후 항목 29까지 (20)

Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
M5 1 1
M5 1 1M5 1 1
M5 1 1
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
3 4 1
3 4 13 4 1
3 4 1
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 

More from Dong Chan Shin

C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
User experience Design에 활용되는 각종 용어 정리
User experience Design에 활용되는 각종 용어 정리User experience Design에 활용되는 각종 용어 정리
User experience Design에 활용되는 각종 용어 정리Dong Chan Shin
 
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Project anarchy로 3d 게임 만들기 part_5_waste of time shovelingProject anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Project anarchy로 3d 게임 만들기 part_5_waste of time shovelingDong Chan Shin
 
Project anarchy로 3d 게임 만들기 part_4_network_memory management
Project anarchy로 3d 게임 만들기 part_4_network_memory managementProject anarchy로 3d 게임 만들기 part_4_network_memory management
Project anarchy로 3d 게임 만들기 part_4_network_memory managementDong Chan Shin
 
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여Dong Chan Shin
 
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Dong Chan Shin
 
몰입 인지공백 프래그난쯔법칙 스토리텔링
몰입 인지공백 프래그난쯔법칙 스토리텔링몰입 인지공백 프래그난쯔법칙 스토리텔링
몰입 인지공백 프래그난쯔법칙 스토리텔링Dong Chan Shin
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
Unreal summit 2014 다시 보기
Unreal summit 2014 다시 보기Unreal summit 2014 다시 보기
Unreal summit 2014 다시 보기Dong Chan Shin
 
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usability
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usabilityRTS 게임 ui에서 확인 할 수 있는 rts 게임 usability
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usabilityDong Chan Shin
 
Proactor/Reactor Server io 성능 분석
Proactor/Reactor Server io 성능 분석Proactor/Reactor Server io 성능 분석
Proactor/Reactor Server io 성능 분석Dong Chan Shin
 
Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림Dong Chan Shin
 

More from Dong Chan Shin (12)

C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
User experience Design에 활용되는 각종 용어 정리
User experience Design에 활용되는 각종 용어 정리User experience Design에 활용되는 각종 용어 정리
User experience Design에 활용되는 각종 용어 정리
 
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Project anarchy로 3d 게임 만들기 part_5_waste of time shovelingProject anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
 
Project anarchy로 3d 게임 만들기 part_4_network_memory management
Project anarchy로 3d 게임 만들기 part_4_network_memory managementProject anarchy로 3d 게임 만들기 part_4_network_memory management
Project anarchy로 3d 게임 만들기 part_4_network_memory management
 
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여
Project anarchy로 3d 게임 만들기 part_3_움직여라 움직여
 
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
 
몰입 인지공백 프래그난쯔법칙 스토리텔링
몰입 인지공백 프래그난쯔법칙 스토리텔링몰입 인지공백 프래그난쯔법칙 스토리텔링
몰입 인지공백 프래그난쯔법칙 스토리텔링
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
Unreal summit 2014 다시 보기
Unreal summit 2014 다시 보기Unreal summit 2014 다시 보기
Unreal summit 2014 다시 보기
 
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usability
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usabilityRTS 게임 ui에서 확인 할 수 있는 rts 게임 usability
RTS 게임 ui에서 확인 할 수 있는 rts 게임 usability
 
Proactor/Reactor Server io 성능 분석
Proactor/Reactor Server io 성능 분석Proactor/Reactor Server io 성능 분석
Proactor/Reactor Server io 성능 분석
 
Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림
 

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

  • 1. more Effective C++ Chapter 5 항목 29까지 ‘유용하고 재미있는 프로그래밍 기법들_1’ 131039 신동찬
  • 3. smart_ptr shared_ptr 이미 Effective C++에서 다루고 넘어온 친구들 특히 항목 29에서 Shared_ptr의 언급이 없음  more effective c++도 개정판이 필요함... 참고 : http://www.slideshare.net/Dong-chan_Shin/effective-c-chapter3-4-33053208
  • 4. 물론 앞선 내용에서는 ‘tr1, boost에서 제공되는 기능을 어떻게 쓰는가?’에 초점 More Effective C++는 해당 기능이 어떻게 만들어 졌는가에 대한 이야기 smart_ptr shared_ptr 두 녀석의 내부 형태를 가늠할 수 있음
  • 5. 결국에는 프로그래머가 메모리에 ‘원하는 객체를 생성하고’ ‘원하는 시점에 삭제하고’ ‘완전히 삭제 되었다는 것을 보장하는’ 기법들을 소개하는 내용이 주요 내용 주의할 점! 지난 시간에도 나왔듯 일부 내용에 대해서는 Trade-off를 고려해야 함
  • 6. 가상 생성자 생성자에도 virtual을 붙인다? virtual(어디서는 퍅셔미로 쓰고 있죠;;)를 어디서 봤죠? 런타임시 동적 할당 가상 생성자는 생소한 표현일 수 있으나 기능은 예측 가능함 ‘자신이 받은 입력 데이터에 의존하여 다른 타입의 객체 생성 함수’
  • 7. 특히 잘 쓰이는 부분은 가상 복사 생성자 호출 객체를 그대로 뜬 사본의 포인터를 반환 (clone을 만들어 냄) 위 샘플처럼 리스트 각 요소에 대해 가상 복사 생성자를 호출해 text/graphic 객체에 대한 일을 처리
  • 8. 일을 하다 보면 비멤버 함수도 동적 타입에 따라 다른 동작을 시키고 싶어집니다. 이럴 경우 비멤버 함수를 가상 함수화 하면 가능합니다. class 정의시 원하는 일을 하는 가상 함수를 만들고 비가상 함수에서 호출하면 가능 함수 호출 비용을 줄이기 위해 inline 함수로 처리
  • 9. 이렇게 동적 할당해서 사용하는 건 좋은데... 항상 메모리 릭은 클래스 인스턴스를 할당해서 사용하다가 빠뜨리는데 시작한다 이런 자원 낭비를 막는 방법? 방법1. 클래스 인스턴스 개수를 스스로 조절하게 끔 방법2. 스마트한 녀석이 되도록 함 방법3. 자신을 참조 카운트를 들고 있어 메모를 통해 스스로를 조절 어떤 방법을 써서라도 클래스 인스턴스를 관리 영역에 넣어보자!
  • 10. ‘객체가 생성될 수 있는 3가지 상황’을 지배하는 자가 코드코트를 지배한다 1. 자체로 생성될 때 2. 파생된 객체의 기본 클래스 부분으로 만들어질 때 3. 다른 객체의 클래스 멤버로 만들어질 때 우리는 쉽게 그 자체로 생성할 때 즉, new만 알아서 적절히 통제하면 되겠지... 당연히 그렇지 않다
  • 11. 프린트 클래스를 예로 들면 Printer의 기본 생성자를 private로 묶어 함부로 생성할 수 없게 제한 Printer객체를 함수의 정적 객체로 만들어 함수 호출로 객체 생성
  • 12. 개수를 컨트롤 하는 방법은 개수에 따라 발생하는 예외 클래스를 생성 예외 클래스에 따라 해당 내용을 처리하도록 함 numObjects의 숫자를 변경함으로서 객체 개수도 제어
  • 13. 현재 상태는 본인이 몇 개를 생성했는지는 알 수 없고 다만 결정된 개수보다 많으면 예외가 나오는 형태 당연히 인스턴스 카운팅 기능을 달아주면 기능이 확장 된다 쉬운 방법은 상위 카운팅 클래스를 만들어 상속하는 것이지만 다양한 클래스, 그에 해당하는 별도의 카운터를 두는 것은 낭비 클래스 템플릿으로 만들어 원하는 카운터를 자동으로 만들자
  • 14. 프린터 클래스 적용 사례 클래스 템플릿을 사용하면 객체 클래스에서 클래스 템플릿에서 상속 받는 기능을 신경 쓸 이유가 없음
  • 15. 이렇게 프로그래머가 생성/삭제하는 것은 전부 힙(heap) 에서 생긴다고 알고 있는데 사실 항상 그렇지 않다! 모든 것이 가능한 C++에게 그런 제한은 없다 절대로 메모리 누수가 일어나지 않도록 하기 위해 힙 외 공간에서 객체 생성도 가능함 특히 임베디드 시스템용 프로그램에서 빈번함 또한 앞서에서도 프린트 객체의 실체는 정적 영역에 있다
  • 16. 즉 heap과 stack만 구분하면 끝이 아니라... 정적 객체도 있음을 항상 생각해야 한다 따라서 무조건 주소 기반으로 탐색해 나가는 방법 힙 영역에 잘 안착했는지 찾기 위해서라면, 완전 무의미한 방법이다 그 구분에 대한 인식을 확실히 하자
  • 17. 객체를 힙에 할당하지 않는 방법은? 힙은 new를 통하지 않으면 안 됨 이미 앞선 코드에 나왔듯, private 등으로 new 사용을 막아버리면 됨 객체가 힙에 있을 때 예외를 일으키는 방법은? 없다 컴파일러 특성 등에 따라 그때그때 다른 결과가 나오기 때문
  • 18. 스마트 포인터(smart_ptr) effective C++ 자원 부분에서 수없이 등장했었다 • 생성과 소멸 작업을 조절 • 복사와 대입 동작 조절 • 역참조 동작 조절 우리가 봤던 smart_ptr은 어디서 참조하든 혼자만 오롯한 포인터 (이전 참조 삭제) 즉 More effective c++에서 제시하는 조절을 적절히 반영함
  • 19. 대입 흔히 복사가 일어나는데 반해 스마트 포인터에서는 단순하지 않습니다 대입은 소유권을 이전하는 것 특정 객체의 소유권을 가지고 있다고 생각 따라서 새로운 객체가 대입되는 경우 기존에 가지고 있던 객체를 반드시 삭제해야 함
  • 20. 스마트 포인터와 상속타입 변환이 항상 가능한가? 1단계만 상속한 경우 가능한 것 처럼 구현할 수 있으나, 결론적으로 불가능 함 스마트 포인터에서는 멤버 함수를 써서 타입변환을 수행 C++ 컴파일러는 모호함을 극복하지 못하고 에러 발생 일일이 캐스팅을 해줘야 함
  • 21. 스마트 포인터 역시 ‘만능은 없다’를 증명 • null 확인 • 벙어리 포인터로의 변환 • 상속 깁낭의 변환 • 상수객체에 대한 포인터 지원 이런 데서 스마트 포인터의 사용은 악
  • 22. C++는 왜! 메모리를 알아서 해주는 가비지 컬렉터가 없는가?! 참조 포인터를 사용하면 유사하게 사용은 가능! 객체의 소유권 추적 똑같은 값을 가지고 있는 객체의 반복 양산 메모리 관리에 문제가 발생할 가능성이 있음
  • 23. 사용 카운트를 둬 사용 현황을 유지함 참조 포인터의 자료구조(String의 경우)
  • 24. 와 이거 좋은데요~! 그런데 왜 보기가 힘들까요? 여기서 다시 보는 Trade-off 기본적으로 추가된 객체만큼 메로리 추가 소모 메모리 접근 코드 필요 포인터와 관련된 모든 동작에서 참조 횟수 조작 실행 객체들 사이에서 값의 공유가 빈번하면 최적화 기법 아니라면 낭비가 됩니다
  • 25. 상대적으로 많은 객체들이 상대적으로 적은 값을 공유할 때 어떤 객체값을 생성하거나 소멸시키는데 많은 비용이 들거나 메모리 소모가 클 때 고려하세요 :)