[특강] 강석민 강사님 advanced c++ 2일차
- 프로그래밍/C++
- 2014. 12. 12. 10:23
특강명 : advanced C++
강사님 : 강석민
cafe.naver.com/cppmaster
smkang@ioacademy.co.kr
[2일차 수업 내용]
1.inline
2.object copy
3.smart pointer
자료(cpp파일):
1.inline
인라인 함수는 컴파일 시간 문법이다.
인라인 함수라도 함수 포인터에 담으면 인라인 치환이 될수 없다!!!!
(함수 포인터는 실행시간에 언제든 바뀔 수 있기때문에)
일반 함수는 자신만의 타입이 없다!
즉! signature가 동일한 모든 함수는 같은 타입이다. = 리턴값과 매개변수가 같으면 같은 타입의 함수다!!
모든 함수 객체는 자신만의 타입이 있다!!
즉! signature가 동일해도 모든 함수객체는 다른 타입이다!!! (일반 함수와의 차이점이 중요)
좀 더 알아보기 - sort(..)함수등의 매개 변수에 일반함수/함수객체를 사용할 경우 장/단점
1) 비교 정책으로 일반함수를 사용할때
장점 : 정책을 여러번 교체해도 sort()기계어는 하나이다. 즉! code메모리 감소!
단점 : 정책이 인라인 치환될수 없다. 그래서 성능 저하가 있다!!!
3) C++11에는 함수객체를 쉽게 만드는 문법이 등장!
함수 인자로 코드의 덩어리를 전달하는 문법 : 람다! - VC는 2010부터 지원
그럼 람다는 inline일까 아닐까?? => 당연히 인라인화가 되어야함
그런 의미에서 람다는 자기만의 타입을 가져야함
즉 람다를 많이 사용하면 코드 덩어리가 증가 한다!!
2.object copy
깊은복사 얕은복사에 대해서 다룬다.
얕은 복사를 해결하는 방법에는 4가지가 있다.
[복사 기술 총정리]
객체를 복사 할떄 사용되는 5가지 개념
1.얕은 복사
2,깊은 복사
3.참조 갯수(reference counting) - 자원 사용갯수 관리
4.소유권 이전(move sentence) - STL의 auto_ptr<>개념 (메모리를 복사를 것이 아니라 소유권을 넘겨준다)
C++에서는 사용금지, 대신 unique_ptr
C++11의 move생성자로 발전했다.
( ex) Cat2(Cat2&& c) {} )
5.복사 금지 - private 생성자
C++11의 delete, function 문법으로 발전
스마트 포인터, 싱글톤 등에서 널리 사용
3.Smart Pointer
* 개념 : 다른객체의 포인터 역할을 하는 객체
* 구현 방법 : ->와 *연산자 재정의를 만든다(포인터 역할을 하기위해)
* 특징 : 진짜 포인터가 아닌 객체이다. 셍성/복사/대입/소멸의 모든 과정을 사용자가 제어 가능
* 대표적 활용 : 소멸자에서늬 자동 삭제
* 일반적인 스마트포인터 만들기!
1) 모든타입이 가능하도록 template화
2) 얕은 복사의 해결책을 제공해야한다. (보통은 참조계수 방법을 많이 사용)
* 스마트포인터 만들때의 생각해볼 것!
Ptr<Dog> p1 = new Dog;
Ptr<Animal> p2 = p1; // error!!
이런것이 되야하므로 복사 생성자, 대입연산자, ==, != 연산자의 Generic버전이 반드시 필요하다!
(예시는 접기를 펼치시면 나옵니다)
* 참조계수를 사용하는 방법
1) 포인터에 참조계수를 넣어 사용하는 방법 - shared_ptr<> C++ 표준
2) 객체 자체에 참조계수를 넣어 사용하는 방법 - 다양한 오픈 소스들 (COM : ATL의 CComPtr<>클래스, 안드로이드 : sp<> 등등)
* 자원자체에서 참조계수넣고, 참조계수를 관리하는 스마트포인터를 만들어봅시다.
이 글을 공유하기