在UEC++中使用什么方式返回像 FTransform 这种类型的值
在UEC++中使用什么方式返回像 FTransform 这种类型的值
在虚幻引擎当想获取一个函数计算好的值,并且类型是 FTranform 时。使用什么方式返回比较好呢。目前有四种方式
方式一:通过值的方式返回
FTransfom GetThingWorldLocation()
{FTranform TempTranform = FTranform::Identity;//..计算出 TempTranform return TempTranform;
}
方式二:通过引用传递的方式
// 调用的地方
FTranform TempTransform; // 调用者提供存储内存
GetThingWolrdLocation(TempTransform);//源文件
void GetThingWolrdLocation(FVector& OutTransform)
{FTranform TempTransform = FTransform::Identity;//...计算出 TempTrnaformOutTranform = TempTransform;
}
方式三:通过指针的方式
// 调用的地方
FTransform* TempTranform = GetThingWorldLocation();//局部变量 TempTransformTransform 存储在函数栈帧中,当函数执行结束时,栈帧被销毁,该变量的内存空间会被释放。此时返回的指针将指向一块“已释放的内存”(悬垂指针),后续对该指针的任何访问(如解引用)都会导致未定义行为(崩溃、数据错乱等)。// 源码方式1:
FTransform* GetThingWorldLocation()
{FTransform TempTransform = FTransform::Identity;// 计算出 FTransform return &TempTransform;
}
方式四:返回引用的方式
FTransform& GetThingWorldLocation()
{FTransoform TempTransform = FTransform::Identity;return TempTransform; // 返回后, TempTransform 已销毁,引用失效
}
对于上面的四种方式对于 FTransform 来说,直接返回值的方式即可。
FTransform 在 Unreal 中是一个 128字节的结构体(包含 FVector 位置、FQuat 旋转、FVector 缩放,各占16字节,共 16×3=48 字节;或按矩阵存储为 FMatrix 的16个浮点数,共 16×4=64 字节,具体取决于引擎版本,但均远小于“性能敏感”的阈值)。
对于确实需要避免复制的大型结构体(如包含数百个元素的数组),可通过 输出参数(引用传递) 让调用者提供内存空间。
对于 FTransform 这类中小型结构体,按值返回的性能与输出参数基本一致(甚至因 NRVO 优化更优),但代码可读性更好。
现代编译器(如 MSVC、Clang)会通过 返回值优化(RVO/NRVO) 消除按值返回的复制开销:
- NRVO(具名返回值优化):编译器直接在调用者的栈空间中构造 SplineStartTransform,避免函数内部局部变量到返回值的复制。
- 即使未触发 NRVO,FTransform 的复制操作(128字节)在现代 CPU 上耗时约 1-2纳秒(亿分之一秒),对游戏逻辑帧率(通常需要每帧处理毫秒级任务)来说完全可忽略。
而上面的按指针返回和按引用返回的方式都会导致悬垂指针,并且在编译的时候就会报错。
辑帧率(通常需要每帧处理毫秒级任务)来说完全可忽略。
而上面的按指针返回和按引用返回的方式都会导致悬垂指针,并且在编译的时候就会报错。
在 Unreal Engine 中,所有值类型(FVector、FRotator、FTransform、FColor 等)均应按值传递和返回,这是引擎的标准设计模式,也是避免内存错误的关键原则。
