参考虚幻引擎UObjectBase类源代码定义出自己的 UObject对象成员函数偏移量

源代码路径:

Engine\Source\Runtime\CoreUObject\Public\UObject\UObjectBase.h

   // 0 ++ VTable                                        0x0 + 0x8/** Flags used to track and report various object states. This needs to be 8 byte aligned on 32-bitplatforms to reduce memory waste */EObjectFlags                  ObjectFlags;        // 0x8 + 0x4 =0xC/** Index into GObjectArray...very private. */int32                              InternalIndex;  // 0xC +4 = 0x10/** Class the object belongs to. */UClass*                            ClassPrivate;       // 0x10 +8 = 0x18 /** Name of this object */FName                         NamePrivate;        // 0x18 + 4 = 0x1C/** Object this object resides in. */UObject*                       OuterPrivate;       //0x1C + 8

定义UObject偏移量为:

  struct {int  VTablePtr64 = 0x0;int ObjectFlags = 0x8;int Index = 0xC;  // 前面有虚表指针和ObjectFlagsint  Class = 0x10;int FName = 0x18;int Outer = 0x20;} UObject;

完整UObjectBase源代码:


class COREUOBJECT_API UObjectBase
{friend class UObjectBaseUtility;friend COREUOBJECT_API class UClass* Z_Construct_UClass_UObject();friend class FUObjectArray; // for access to InternalIndex without revealing it to anyone elsefriend class FUObjectAllocator; // for access to destructor without revealing it to anyone elsefriend COREUOBJECT_API void UObjectForceRegistration(UObjectBase* Object);friend COREUOBJECT_API void InitializePrivateStaticClass(class UClass* TClass_Super_StaticClass,class UClass* TClass_PrivateStaticClass,class UClass* TClass_WithinClass_StaticClass,const TCHAR* PackageName,const TCHAR* Name);
protected:UObjectBase() :NamePrivate(NoInit)  // screwy, but the name was already set and we don't want to set it again{}/*** Constructor used for bootstrapping* @param  InFlags         RF_Flags to assign*/UObjectBase( EObjectFlags InFlags );
public:/*** Constructor used by StaticAllocateObject* @param   InClass             non NULL, this gives the class of the new object, if known at this time* @param    InFlags             RF_Flags to assign* @param InInternalFlags EInternalObjectFlags to assign* @param InOuter             outer for this object* @param  InName              name of the new object*/UObjectBase( UClass* InClass, EObjectFlags InFlags, EInternalObjectFlags InInternalFlags, UObject *InOuter, FName InName );/*** Final destructor, removes the object from the object array, and indirectly, from any annotations**/virtual ~UObjectBase();/*** Emit GC tokens for UObjectBase, this might be UObject::StaticClass or Default__Class**/static void EmitBaseReferences(UClass *RootClass);protected:/*** Just change the FName and Outer and rehash into name hash tables. For use by higher level rename functions.** @param NewName    new name for this object* @param NewOuter  new outer for this object, if NULL, outer will be unchanged*/void LowLevelRename(FName NewName,UObject *NewOuter = NULL);/** Force any base classes to be registered first */virtual void RegisterDependencies() {}/** Enqueue the registration for this object. */void Register(const TCHAR* PackageName,const TCHAR* Name);/*** Convert a boot-strap registered class into a real one, add to uobject array, etc** @param UClassStaticClass Now that it is known, fill in UClass::StaticClass() as the class*/virtual void DeferredRegister(UClass *UClassStaticClass,const TCHAR* PackageName,const TCHAR* Name);private:/*** Add a newly created object to the name hash tables and the object array** @param Name name to assign to this uobject* @param InSetInternalFlags Internal object flags to be set on the object once it's been added to the array*/void AddObject(FName Name, EInternalObjectFlags InSetInternalFlags);
public:/*** Checks to see if the object appears to be valid* @return true if this appears to be a valid object*/bool IsValidLowLevel() const;/*** Faster version of IsValidLowLevel.* Checks to see if the object appears to be valid by checking pointers and their alignment.* Name and InternalIndex checks are less accurate than IsValidLowLevel.* @param bRecursive true if the Class pointer should be checked with IsValidLowLevelFast* @return true if this appears to be a valid object*/bool IsValidLowLevelFast(bool bRecursive = true) const;/** * Returns the unique ID of the object...these are reused so it is only unique while the object is alive.* Useful as a tag.**/FORCEINLINE uint32 GetUniqueID() const{return (uint32)InternalIndex;}FORCEINLINE UClass* GetClass() const{return ClassPrivate;}FORCEINLINE UObject* GetOuter() const{return OuterPrivate;}FORCEINLINE FName GetFName() const{return NamePrivate;}/** * Returns the stat ID of the object...**/FORCEINLINE TStatId GetStatID(bool bForDeferredUse = false) const{
#if STATS// this is done to avoid even registering stats for a disabled group (unless we plan on using it later)if (bForDeferredUse || FThreadStats::IsCollectingData(GET_STATID(STAT_UObjectsStatGroupTester))){if (!StatID.IsValidStat()){CreateStatID();}return StatID;}
#endifreturn TStatId(); // not doing stats at the moment, or ever}private:/** * Creates this stat ID for the object...and handle a null this pointer**/
#if STATSvoid CreateStatID() const;
#endifprotected:/*** Set the object flags directly***/FORCEINLINE void SetFlagsTo( EObjectFlags NewFlags ){checkfSlow((NewFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as 0x%x but is trying to set flags to RF_AllFlags"), *GetFName().ToString(), (int)ObjectFlags);ObjectFlags = NewFlags;}
public:/*** Retrieve the object flags directly** @return Flags for this object**/FORCEINLINE EObjectFlags GetFlags() const{checkfSlow((ObjectFlags & ~RF_AllFlags) == 0, TEXT("%s flagged as RF_AllFlags"), *GetFName().ToString());return ObjectFlags;}/***   Atomically adds the specified flags.*   Do not use unless you know what you are doing.* Designed to be used only by parallel GC and UObject loading thread.*/FORCENOINLINE void AtomicallySetFlags( EObjectFlags FlagsToAdd ){int32 OldFlags = 0;int32 NewFlags = 0;do {OldFlags = ObjectFlags;NewFlags = OldFlags | FlagsToAdd;}while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags );}/***    Atomically clears the specified flags.* Do not use unless you know what you are doing.* Designed to be used only by parallel GC and UObject loading thread.*/FORCENOINLINE void AtomicallyClearFlags( EObjectFlags FlagsToClear ){int32 OldFlags = 0;int32 NewFlags = 0;do {OldFlags = ObjectFlags;NewFlags = OldFlags & ~FlagsToClear;}while( FPlatformAtomics::InterlockedCompareExchange( (int32*)&ObjectFlags, NewFlags, OldFlags) != OldFlags );}private:// 0 ++++VTable                                        0x0 + 0x8/** Flags used to track and report various object states. This needs to be 8 byte aligned on 32-bitplatforms to reduce memory waste */EObjectFlags                  ObjectFlags;        // 0x8 + 0x4 =0xC/** Index into GObjectArray...very private. */int32                              InternalIndex;  // 0xC +4 = 0x10/** Class the object belongs to. */UClass*                            ClassPrivate;       // 0x10 +8 = 0x18 /** Name of this object */FName                         NamePrivate;        // 0x18 + 4 = 0x1C/** Object this object resides in. */UObject*                       OuterPrivate;       //0x1C + 8/** Stat id of this object, 0 if nobody asked for it yet */STAT(mutable TStatId              StatID;)// This is used by the reinstancer to re-class and re-archetype the current instances of a class before recompilingfriend class FBlueprintCompileReinstancer;void SetClass(UClass* NewClass);#if HACK_HEADER_GENERATOR// Required by UHT makefiles for internal data serialization.friend struct FObjectBaseArchiveProxy;
#endif // HACK_HEADER_GENERATOR
};

参考虚幻引擎UObjectBase类源代码定义出 UObject对象成员的偏移量相关推荐

  1. 面向过程和面向对象的设计思想、java类、Java类的定义、java对象、对象的创建和使用、类和对象、变量分类、方法分类、构造方法、方法的重载

    1.面向过程和面向对象的设计思想 面向过程:procedure oriented programming 缩写 POP. 分析出解决问题所需要的步骤,然后把步骤一步一步实现. 面向过程直接关注流程. ...

  2. (25.2)类的定义之类的数据成员,类的成员函数,类的声明

    文章目录 1.类的数据成员 2.类的成员函数 3.成员函数重载及默认参数 4.成员函数的存储方式 5.类的声明 1.类的数据成员 (1)在类中声明数据成员 正如我们所见, 类的数据成员的声明类似于普通 ...

  3. python为什么要实例化对象_python:类的定义、实例化对象

    定义:类的定义使用关键字 ,class 关键字: 封装:类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象 属性:变量在类中称为属性,但是类中的属性不仅仅只包含变量 ...

  4. python类中定义数据-类数据成员与对象数据成员

    类数据成员 python的类数据成员是不需要用self修饰的.例如 class my_class(object):value_list=[1,2]class1=my_class()print(my_c ...

  5. UE4 虚幻引擎,更改源代码编辑器 Visual Studio ,Rider

    PS: Visual Studio 和Rider需要先安装.

  6. 从Java到Go面向对象--类的定义和实例化对象

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象基本思想 类.对象. #面向对象三大特征 封装.继承.多态. 接下来我会一一介绍Go的面向对象编程 Java中类的定义 ...

  7. 几种将将虚幻引擎内容流送到多个平台的推流方案比较

    将虚幻引擎内容流送到多个平台,比较 HTML5.WebGL 和像素流送.Raystreaming. 简介 在开发联网用户体验时,如何共享内容始终影响着协作.生产和发布中的关键决策.假如用户在消费并与共 ...

  8. 虚幻引擎(7)-持枪射击

    文章目录 前言 其他介绍 上一篇笔记 下一篇笔记 动态预览图 蓝图预览 [1]. 角色蓝图 [2]. 子弹蓝图 一.导入第一人称包 [1]. 在开始时选择 [2]. 创建后导入 二.创建操作映射(绑定 ...

  9. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用

    对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...

最新文章

  1. css样式继承规则详解
  2. mysql show作用_mysql的show操作
  3. python实验报告二_分组级运算和转换
  4. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
  5. matlab disteclud,机器学习实战ByMatlab(四)二分K-means算法
  6. Android 第一篇
  7. Spring Cloud微服务之Hystrix服务熔断(十二)
  8. mysql最早出现的数据模型_在数据库发展史中出现的数据模型有哪些
  9. 用Azure Application Insights 监控Python应用(1)
  10. 远程桌面连接无法全屏显示
  11. 如何保持自己 fork 的项目和原始项目同步
  12. 【笔记】如何配置kvm桥接网络
  13. 关于西门子STEP7 在Windows10安装的一些心得
  14. IT桔子沙龙之本地生活服务O2O探路者笔记整理
  15. java语言将一个字符串集合按GBK编码(简体中文按拼音顺序)排序
  16. ajax $.get怎么使用,jquery之ajax之$.get方法的使用
  17. linux下tar命令解压缩,tar解压缩命令 Linux下的tar压缩解压缩命令详解
  18. 【华人学者风采】李海洲 新加坡国立大学
  19. 那些酷炫的网页你也可以做到——第二篇(HTML排版)
  20. Greenplum 添加mirror步骤

热门文章

  1. 【时间管理】 -- 顺应人性的时间管理法
  2. 数字信号处理上机实验一 离散时间信号的时域分析
  3. 王文彬:阿里云的下一步
  4. SRRC认证全面解析
  5. 针对高分辨率雷达和相机的无标定板的像素级外参自标定方法
  6. Linux常用操作和命令
  7. 夏天晚上睡觉点蚊香对身体有害?+几招防蚊、驱蚊办法
  8. C++中set容器的基本使用----在B站听黑马程序员c++课程的记录
  9. linux服务器 使用教程
  10. 【刚刚开源!】超级优秀地解决Python人工智能计算慢问题(附源码+长期更新+必会)