zoukankan      html  css  js  c++  java
  • UE3名称结构(Name)

    解释说明:

    (1) 直接通过FName的Index和Number进行比较来判断两个FName是否相等

    (2) 通过FName的Index从全局Names数组中取出对应的FNameEntry,可以获得FName的字符串内容

    (3) 全局NameHash链表数组是为了优化查找而存在的数据结构

    (4) 创建一个FName时,会在全局NameHash链表数组查找是否已存在:

         若存在则直接设置当前FName的Index;若不存在才会创建新的FNameEntry,并添加到Names末尾和对应NameHash链表的头部

    (5) UE3名称为大小写不敏感的;若要将名称改为大小写敏感,要注意两个地方:①大小写敏感进行hash值计算  ②大小写敏感进行链表中线性查找

    TArrayNoInit<FNameEntry*> Names (Names长度为12个字节)结构详解:

    注1:定义了SUPPORT_NAME_FLAGS宏,FNameEntry才会有EObjectFlags Flags(typedef QWORD EObjectFlags)成员变量

         #define SUPPORT_NAME_FLAGS !(CONSOLE && FINAL_RELEASE)

         即:开启了FINAL_RELEASE宏的发布版本,是没有Flags成员变量的

    注2:UE中,在使用TArrayNoInit数组变量之前,必须显示地初始化,否则数组中的Data、ArrayNum、ArrayMax会为随机值,最后会导致该变量在析构回收堆内存时,引发堆破坏

         可以用以下方式进行抹零初始化:appMemzero(&FName::Names, sizeof(FName::Names));//Data、ArrayNum、ArrayMax全部为0

    注3:含有array成员的native脚本的struct变量,作为局部变量在c++函数中使用时,若不想如注2那样显示地初始化

         可以在array之前加上init关键字,使得其转换成c++中的TArray类型(若不加init,则会生成TArrayNoInit类型)

         来自于native脚本中这种成员变量不存在该问题,因为在构建这个Object对象时,会对该成员变量进行初始化

         struct native UniqueNetId

         { 

               var init array<int> NetParamID;

         };

  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/kekec/p/5435175.html
Copyright © 2011-2022 走看看