Unreal Engine에서 Move Semantics
Source: Dev.to
복사 문제
전통적인 C++98 프로그래밍에서는 객체를 생성하는 두 가지 방법이 있었습니다: 처음부터 만들기와 복사하기.
Foo(); // Default ctor
Foo(int x); // Parameterized ctor
Foo(const Foo& rhs); // Copy ctor
Foo& operator=(const Foo& rhs); // Copy assignment
복사는 보통 더 많은 프로세서 자원을 소모합니다. 이를 해결하기 위해 C++11에서는 이동 의미론(move semantics)을 도입했습니다.
Foo(Foo&& rhs); // Move ctor
Foo& operator=(Foo&& rhs); // Move assignment
객체를 이동하는 것이 복사보다 메모리 효율적일 수 있습니다(항상 그런 것은 아닙니다).
특수 함수 구현 시점
맞춤형 이동 생성자를 구현할지 여부는 Rule of Three/Five/Zero에 달려 있습니다. 스스로에게 물어보세요: 당신의 타입이 소유권이나 동적 자원을 관리하고 있나요?
Plain Old Data 타입의 경우
POD 타입이나 멤버에 대해서는 이동이 본질적으로 복사와 동일합니다. 다음 타입들을 std::vector에 추가할 때의 차이를 살펴보세요:
// 재할당이 필요 없으며, 동적 메모리 포인터만 복사하면 됨
// sizeof(Foo) = 24 (gcc, Win64)
struct Foo {
std::vector numbers; // 1000개의 요소를 가진 동적 벡터
};
// 전체 복사가 필요; 모든 데이터를 복제해야 함
// sizeof(Bar) = 4000 (gcc, Win64)
struct Bar {
int numbers[1000];
};
언리얼 엔진 용어
언리얼 엔진은 자체 네이밍 규칙을 사용하며 표준 라이브러리와 동등한 스마트 포인터를 제공합니다:
TUniquePtrTSharedPtrTWeakPtr
Note:
UObject는 이동될 수 없으며 스마트 포인터로 참조될 수 없습니다; 항상 가비지 컬렉터에 의해 관리되고 원시 포인터로 참조됩니다.- r‑value‑reference 또는 스마트 포인터 매개변수를 가진 함수는 Blueprint에 노출될 수 없습니다.
UStruct는 사용자 정의 이동 기능을 정의할 수 있지만, 보통은 단순 데이터 구조이기 때문에 큰 이점을 얻지 못합니다.
