美文网首页
FStruct和UNewClass 在元素类型中小小区别

FStruct和UNewClass 在元素类型中小小区别

作者: Edwin_红狼 | 来源:发表于2023-11-06 14:03 被阅读0次

    为什么在UE5中C++,TArray<UNewClass*>指针而不支持TArray<UNewClass>对象

    在UE4和UE5中,TArray<UNewClass*>意味着这是一个指针数组,数组的每个元素都是指向UNewClass对象的指针。而TArray<UNewClass>则是对象数组,每个元素都是UNewClass对象的实例。

    UE的GC(Garbage Collection,垃圾回收器)通过引用计数来管理内存,对于UObject类型(即所有Unreal类的基本类型),GC仅跟踪对象的指针以判断对象是否仍在使用。如果只有对象实例而没有指针指向它,GC可能错误地认为这个对象没有被使用,然后在下一次垃图回收中删除它。这就是为什么在Unreal中通常使用对象指针而非对象实例。

    此外,创建对象实例(TArray<UNewClass>)可能会导致开销较大,特别是当对象很大或需要频繁创建和销毁时。而使用对象指针(TArray<UNewClass*>),则可以通过新建、销毁指针来进行有效的内存管理,避免对象的频繁创建和销毁引起的性能问题。

    那为什么在UE5中C++,TArray<FStruct*>指针并不支持而是支持TArray<FStruct>对象?

    FStruct对象和UObject对象在Unreal Engine中被处理的方式不同。FStruct是在栈上实例化的,不会被垃圾收集系统,也没有元数据用于反射。另外,FStruct是值类型,拷贝这种类型的数据意味着内存里会有两份完全一样的复制品。

    因此,TArray<FStruct*>在Unreal Engine中并不常用,如果使用指针的话,就会有责任去跟踪和删除不再需要的内存,而这并不是UE整体设计思路中的自动化内存管理。而TArray<FStruct>则是将具体的FStruct对象实例存储在数组中,你无需去关心对象的创建和销毁,UE会自动管理其生命周期。

    在实际开发中,使用TArray<FStruct>而不是TArray<FStruct*>,可以使代码更易读和理解,也可以避免内存泄露。也因为结构体是值类型,每一次复制都是创建新的内存,因此复制操作相当快,这是支持使用TArray<FStruct>的一个重要原因。

    相关文章

      网友评论

          本文标题:FStruct和UNewClass 在元素类型中小小区别

          本文链接:https://www.haomeiwen.com/subject/axtxwdtx.html