[특강] 강석민 강사님 advanced c++ 2일차

특강명 : advanced C++ 

강사님 : 강석민

cafe.naver.com/cppmaster

smkang@ioacademy.co.kr


[2일차 수업 내용]

1.inline

2.object copy

3.smart pointer


자료(cpp파일):

Cpp_2주차.zip



1.inline

인라인 함수는 컴파일 시간 문법이다.

인라인 함수라도 함수 포인터에 담으면 인라인 치환이 될수 없다!!!!

(함수 포인터는 실행시간에 언제든 바뀔 수 있기때문에)


일반 함수는 자신만의 타입이 없다!

즉! signature가 동일한 모든 함수는 같은 타입이다. = 리턴값과 매개변수가 같으면 같은 타입의 함수다!!


모든 함수 객체는 자신만의 타입이 있다!!

     즉! signature가 동일해도 모든 함수객체는 다른 타입이다!!! (일반 함수와의 차이점이 중요)



좀 더 알아보기 - sort(..)함수등의 매개 변수에 일반함수/함수객체를 사용할 경우 장/단점

1) 비교 정책으로 일반함수를 사용할때

장점 : 정책을 여러번 교체해도 sort()기계어는 하나이다. 즉! code메모리 감소!

단점 : 정책이 인라인 치환될수 없다. 그래서 성능 저하가 있다!!!


2) 비교 정책으로 함수객체를 사용할때
장점 : 정책이 인라인 치환될 수 있다. 즉! 빠르다!!!
단점 : 정책을 교체한 횟수만큼 sort()의 기계어 코드 생성. 코드 메모리가 증가


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<> 등등)


* 자원자체에서 참조계수넣고, 참조계수를 관리하는 스마트포인터를 만들어봅시다.


이 글을 공유하기

댓글

Designed by JB FACTORY