Modern C++/Move Semantics
-
5. C++11 객체 생성 규칙 Rule of FiveModern C++/Move Semantics 2020. 7. 1. 23:55
C++11 이전 컴파일러가 생성하는 특수 멤버 함수 C++11 이전 컴파일러는 기본 생성자(Basic Constructor), 소멸자(Destructor) , 복사 생성자(Copy Constructor), 복사 할당자(Copy Assignment)를 필요한 경우 자동으로 생성한다. 이는 컴파일 도중 해당 연산을 사용하는 코드가 있는 경우 컴파일러에 의해 암묵적으로 public inline으로 자동으로 생성 된다. class Foo { }; Foo f0; //기본 생성자 생성 Foo f1 = f0; //복사 생성자 생성 Foo f1(f0); //Foo f1 = f0 와 동일 Foo f2; Foo f2 = f0; // 할당 연산자 생성 위의 Foo 클래스는 사용자가 아무것도 정의하지 않았지만 컴파일러가 Fo..
-
4. 이동가능 객체(Movable Type)Modern C++/Move Semantics 2020. 6. 30. 01:15
클래스를 이동 가능하게 만들면 많은 장점들이 있고 이동 가능한 사용자 정의 타입은 표준 라이브러리 유틸과도 잘 동작한다. 이동 연산을 지원하는 클래스를 만드는 경우 코드의 성능, 안정성이나 구현 할 수 있는 방식이 증가한다. 이동 가능한 사용자 타입을 정의하게 되면 표준 라이브리를 사용하는 중에도 이동 연산에 대한 이점을 얻을 수 가 있다. C++11 이전에 컴파일러는 기본 생성자, 소멸자, 복사 생성자, 복사 할당 연산자를 자동으로 추가해 주었는데, C++11 이 후는 여기에 이동 생성자와 이동 할당 연산자가 추가되었다. 여기서는 유리수를 나타내는 Rational 클래스를 통해서 이동 연산이 추가되었을 때 어떤 장점이 있는지 살펴본다. #pragma once #include class Rational ..
-
3. 완벽 전달(Perfect Forwarding)Modern C++/Move Semantics 2020. 6. 29. 23:45
완벽 전달은 임의의 인수를 받아서 이를 다른 함수로 전달할 때 대상 함수에 전달 함수가 받은 것과 동일한 인수를 받아들 일 수 있게 한다. 완벽 전달을 이해하기 위해서 보편참조에 대해 살펴보자. 오른쪽 참조와 보편 참조의 구분 타입 T에 대한 오른값 참조는 T&&로 표기하고 이는 오직 오른값에 바인딩되어 해당 객체가 이동이 될 수 있다는 걸 표현한다. void f(int&& a); // int&& 오른값 참조 int&& a = 10; //int&& 오른값 참조 T&& 가 형식 추론(Type Deduction)과 엮이면 해당 표기는 보편 참조를 나타낸다. 이는 오른값 참조와 왼값 참조 모두에 바인드 될 수 있다. 보편 참조는 형식 추론이 일어나는 템플릿 함수의 매개변수나 auto의 선언에서 볼 수 있다. ..
-
2. std::moveModern C++/Move Semantics 2020. 6. 29. 17:33
오른쪽 값(R-value)는 외부에서 구별할 수 있는 identity가 없는 임시 객체로 해당 객체의 자원의 소유권을 포기할 수 있다고 생각할 수 있다. int foo() { return 5; } foo(); // 함수 호출 시 int형 임시 값이 생성되지만 코드 범위를 벗어나는 경우 자동 소멸 std::vector v0 { 1, 2, 3, 4, 5 }; auto v1 = v0; // v1 의 복사 생성자 호출 위와 같이 벡터 v1을 v0를 통해서 초기화하고 생성하는 경우 v1의 v0의 내부 버퍼를 강제적으로 복사하게 된다. std::vector get_vector { return std::vector {1, 2, 3, 4, 5}; } auto v2 = get_vector(); // 함수 호출 시 임시 ..
-
1. 이동 의미론(Move Semantics)Modern C++/Move Semantics 2020. 6. 29. 12:38
1. 이동 의미론 C++11 이후 C++ 의 가장 중요한 변화 중 하나는 복사를 통한 자원의 낭비를 줄이기 위해 객체 자원의 소유권을 이전 할 수 있는 이동 의미론이 추가되었다는 점이다. class Foo { }; 위와 같이 Foo 클래스 정의 시 컴파일러는 자동으로 기본 생성자, 복사 생성자, 할당 연산자, 소멸자를 생성해 주는 데, C++11 이후에 는 여기에 이동 생성자, 이동 할당 연산자가 추가되었다. 또한 STL 라이브러리의 범용 유틸리티나, 컨테이너들에도 이동 생성자나, 이동 할당 연산자가 구현되어 복사로 인한 쓸데 없는 자원의 소비를 줄일 수 있게 되었다. 이동 생성자와 이동 할당 연산자는 아래와 같은 형태로 std::vector의 예를 통해 확인 할 수 있다. std::vector::vec..