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 使用自己的命名约定,并提供了相当于标准库的智能指针:

  • TUniquePtr
  • TSharedPtr
  • TWeakPtr

注意:

  • UObject 不能被移动或通过智能指针引用;它们始终由垃圾回收器管理,并通过原始指针引用。
  • 带有右值引用或智能指针参数的函数无法在 Blueprint 中暴露。
  • UStruct 可以定义自定义移动功能,但由于它们通常是普通数据结构,收益很少。

Unreal Engine 智能指针示意图

0 浏览
Back to Blog

相关文章

阅读更多 »

可视化组件

可视化组件 可视化组件是仅在编辑器中使用的组件,负责在屏幕或 HUD 上绘制非渲染的调试信息。它们轻量级,……

你的撤销按钮只是一堆煎饼

TL;DR:我使用 Stack 数据结构来实现撤销功能,因为它遵循后进先出(LIFO)原则。每一次状态变化都会被压入栈中……