Unreal Engine 中的移动语义
发布: (2026年3月7日 GMT+8 15:18)
3 分钟阅读
原文: Dev.to
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 引入了移动语义。
Foo(Foo&& rhs); // Move ctor
Foo& operator=(Foo&& rhs); // Move assignment移动对象在内存使用上可能比复制更高效(但并非总是如此)。
何时实现特殊函数
是否实现自定义移动构造函数归结为“三/五/零法则”。问自己:你的类型是否管理所有权或动态资源?
对于普通旧数据类型(POD)
对于 POD 类型或成员,移动本质上与复制相同。考虑将以下类型的实例添加到 std::vector 时的差异:
// 不需要重新分配;指向动态内存的指针可以直接复制
// sizeof(Foo) = 24 (gcc, Win64)
struct Foo {
std::vector numbers; // dynamic vector with 1000 entries
};
// 需要完整复制;所有数据必须被复制一遍
// sizeof(Bar) = 4000 (gcc, Win64)
struct Bar {
int numbers[1000];
};Unreal Engine 术语
Unreal Engine 使用自己的命名约定,并提供了相当于标准库的智能指针:
TUniquePtrTSharedPtrTWeakPtr
注意:
UObject不能被移动或通过智能指针引用;它们始终由垃圾回收器管理,并通过原始指针引用。- 带有右值引用或智能指针参数的函数无法在 Blueprint 中暴露。
UStruct可以定义自定义移动功能,但由于它们通常是普通数据结构,收益很少。
