1. 이동 의미 체계(move semantics)
-
기존의 복사 대신 자원의 소유권을 이동 시켜서 성능을 최적화하는 메커니즘
-
의미 체계 이동을 사용하여 한 개체에서 다른 개체로 리소스(예: 동적으로 할당된 메모리)를 전송하는 코드를 작성할 수 있다
-
이동 의미 체계를 구현하려면 이동 생성자와 이동 할당 연산자(opreator=)를 클래스에 제동한다.
rvalue만 이동이 가능한 이유
- lvalue는 여전히 다른 코드에서 사용될 수 있는 객체이기 때문에, 소유권을 빼앗으면 안 된다.
- 반면 rvalue는 해당 스코프에서만 존재하고 소유권을 뺏어도 괜찮다.
-
이동 생성자 구현
string::string(string&& other) {
this->ptr = other.ptr;
this->len = other.len;
other.ptr = nullptr; // 여기가 '비워지는' 부분
other.len = 0;
}
예제: move연산
예제: vector의 크기 확장
2. 완벽 전달/ 전달 참조
std::forward
- 전달받은 인자를 “원래의 값 전달 방식(lvalue/rvalue)” 그대로 다음 함수로 넘기는 것.
- 이는 함수 템플릿에서만 가능한 기술이며, "완벽 전달(perfect forwarding)"이라고 부른다.
전달 참조 (Forwarding Reference) - 구) 보편 참조 (Universal Reference)
- *완벽 전달(Perfect Forwarding)**을 가능하게 하는 특별한 종류의 참조입니다. 특정 템플릿 문맥에서만 나타납니다.
- 정의: 함수 템플릿에서 타입 추론이 일어나는 T&& 형태의 파라미터입니다.
- 주요 목적: 함수로 전달된 인자의 값 종류(value category - lvalue 또는 rvalue)를 그대로 다음 함수로 전달하는 것.
- 구문 및 조건 (다음 모두 만족):
- 함수 템플릿이어야 합니다.
- 함수 파라미터 타입이 T&& 형태여야 합니다.
- T는 타입 추론되는 템플릿 파라미터여야 합니다.