C++ 3

C++ (복사/이동) 생성자, 할당자, Rule of Three(Five)

Cpp 의 클래스에는 기본 생성자 말고도, 소멸자, 복사 생성자, 복사 할당자, 이동 생성자, 이동 할당자가 존재한다. 위의 다섯가지는 컴파일러가 알아서 만들어 주기 때문에 (기본 생성자 까지도), 일반적으로는 구현할 일이 없지만 만약 클래스에서 raw pointer 멤버 변수 등을 가지고 있어서 메모리 관리가 필요한 경우에는 위와 같은 생성/할당/소멸자를 프로그래머가 직접 구현해 줘야 한다. 이동 생성/할당자를 뺀 세가지를 구현해야 한다는 법칙을 Rule of Three, 이동 생성/할당자를 포함하면 Rule of Five 라고 부른다. 그냥 코드에 주석달았음 참고로 noexcept 같은 경우에는 성능상의 이점도 있다고 한다. C++11 부터는 소멸자 등에 자동으로 컴파일러가 붙여준다고 함 class ..

언어/C++ 2020.11.08

스마트 포인터

RAII RAII : Resource Acquisition Is Initialization 리소스의 라이프사이클과 오브젝트의 라이프사이클을 일치시킨다는 뜻이다. 여기서 리소스란 메모리, 쓰레드, 파일IO, 뮤텍스 ,DB와의 커넥션 등이 있다. C++ 에서는 스마트 포인터를 이용하여 메모리 리소스와 인스턴스의 라이프사이클을 일치시킬 수 있다. unique_ptr 유니크 포인터는 exlusive ownership을 제공하는 스마트 포인터다. 유니크 포인터는 하나의 오브젝트(메모리 영역)을 단 하나의 포인터만 가리키게 한다. include ... class Cat { public : Cat() : mAge{1} {} ~Cat(){} void speak(){cout

언어/C++ 2020.11.08

L_value와 R_value

L-value & R-value L value는 왼쪽에 있는 거, R value는 오른쪽에 있는 거... 가 아니다. L-value는 나중에 다시 부를 수 있는 것. R-value는 그렇지 못한 것.으로 구분하면 쉽다. 예를 들어, int a=0; int b=a; 에서 a 는 L-value이다. 0은 다시 부를 수 없으므로 R-value이다. b 역시 L이겠지? R-value는 임시적으로 생성된 값이라고 볼 수 있다. 그러면 대체 왜 이런 걸 구분할까? R-value를 잘 이용하면 메모리를 효율적으로 사용할 수 있기 때문이다. 예를 들어, 어떤 값이 R-value이고 이 값을 전달하기 위해 몇 개의 변수를 거친다고 가정해보자. 이 값을 전달하기 위해 변수를 거칠 때마다 값을 복사할 필요가 있을까? 어차피..

언어/C++ 2020.10.11