UE4 创建UObject对象的过程:分配空间和构造对象

8 篇文章 0 订阅
4 篇文章 0 订阅

1.UObject创建对象的方法

NewObject<T>()

2.UObject创建对象的过程

在这里插入图片描述

2.1分配内存阶段

0.这个阶段虚幻引擎干涉了标准的内存分配过程,示意图只显示主要过程,实际上还有大量的判断来确保内存对齐、类默认对象不会重复创建等。
1.获取当前UObject对象对应的UClass类的信息,根据类成员变量的总大小(PropertiesSize),加上内存对齐,在内存中分配一块合适的区域,返回这块区域的首指针。
2.Memset将这块区域清零
3.使用PlacementNew对分配好的内存区域调用UObjectBase构造函数。如果对PlacementNew不太熟悉,可以暂时理解为“不分配内存,直接假设当前内存指向的区域为一个已经分配好并与当前对象等大的内存区域,然后调用构造函数”。也就是说此时的UObject既没有分配内存,也没有实例化对象,还是虚无的状态,但是我要向全局对象表注册自己,所以就强行认为自己是一个存在于某个内存上的对象。最后返回的是已经分配好大小的一个内存指针,但这块内存上还没有通过构造函数进行初始化。

2.2构造对象阶段

1.构造FObjectInitializer实例
2.以FObjectInitializer为参数,调用UClass的成员函数指针ClassConstructor,如果自己实现了以FObjectInitializer为参数的构造函数,此时也会调用,最后返回创建的对象。

3.为什么不直接使用PlacementNew完成构造,而要使用UClass的成员变量函数指针ClassConstructor完成对象构造?

首先说明,这个函数指针ClassConstructor是在何处赋值的:通常,这个指针在反射生成的.generated.h中完成注册赋值。如果我们自己实现了一个以FObjectInitializer为参数的构造函数,则直接将这个函数指针指向一个静态函数__DefaultConstructor。

//函数定义
static void __DefaultConstructor(const FObjectInitializer& X)
{
	new((EInternal*)X.GetObj())TClass(X);
}

这个指针指向的是一个静态函数,这个函数的作用就是:获取当前FObjectInitializer对象持有的、刚刚构造出来的UObject的指针(X.GetObj()),然后对其调用PlacementNew,传入FObjectInitializer作为参数(TClass(X),X就是FObjectInitializer),调用构造函数,完成构造。如果开发者只实现了一个无参数的构造函数,则直接调用无参构造函数,完成构造。

还是回到那个问题,为什么使用ClassConstructor?
虚幻引擎希望获得ClassConstructor供复用。也就是说,虚幻引擎希望获得某个类的构造函数,就像一个点金手一样,划出一片内存,然后点一下就会模塑出一个对象。甚至在使用这个点金手的时候,不需要知道这个点金手所属的到底是哪个类。如果使用PlacementNew方案就地构造,就必然需要传入类型参数作为模板参数,这无法满足虚幻引擎的需求。

4.参考资料

《大象无形 虚幻引擎程序设计浅析》

5.其他

以上大部分言论都是来自参考资料,很多话笔者在写下的时候自己也不能完全理解,比如说new((EInternal*)X.GetObj())TClass(X)这个写法中的TClass是什么意思,比如为什么在第二步又提到了一次调用PlacementNew。如果有人能解惑,希望能在下面留言一起学习。

https://blog.csdn.net/tuanxuan123/article/details/53486887 这篇文章中有很多值得学习的地方

6.补充

随手画的调用图,没怎么整理,先直接贴在这里
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值