导图社区 UE4 FMemory 内存管理机制
UE4 FMemory 内存管理机制思维导图,包括:FMemory、FGenericPlatform、Memory、FMalloc。
《谏太宗十思疏》全篇以“思国之安者,必积其德义”为中心展开论述。先从正反两方面进行论述,提出为君必须“居安思危,戒奢以俭”的结论。然后提醒太宗,守成之君易失人心
《建筑消防设施的维护管理》GB25201-2010,内容有值班、巡查、检测、维修、保养、建档,快来看看吧!
《冀中的地道战》这篇课文记叙了在抗日战争中,冀中地道战的产生、作用,地道的结构特点,歌颂了我国人民在对敌斗争中表现出来的顽强斗志和无穷无尽的智慧
社区模板帮助中心,点此进入>>
项目时间管理6大步骤
项目管理的五个步骤
电商部人员工作结构
暮尚正常运转导图
产品经理如何做好项目管理
车队管理
创业者10条创业经
创业十大思维误区
管培生课程作业
商业模型
UE4 FMemory 内存管理机制
自由主题
分支主题2
FMemory
内存管理相关操作的基类 包含Memset,Memcpy Memzero,MemSwap等操作
FPlatformMemory
FGenericPlatformMemory
内存管理器的基类,可以根据平台不同派生子类
FWindowsPlatformMemory
FAndroidPlatformMemory
FIOSPlatformMemory
FMalloc
全局的内存分配器 包含malloc,Free, Realloc,TryMalloc等操作
FMallocTBB
因特尔TBB内存管理器
FMallocBinned
基于内存池片段的分配
BoundSizeToPoolIndex函数
作用是传入想分配的字节数,该函数 就能告知你需要用的内存池该是多大的
Free函数
FreeInline函数
调用GetPoolHeaderFromPointer函数
传入要释放的对象的指针,用对齐函数算出 这个对象的指针对应的内存块(FFreeBlock),并返回
FPerThreadFreeBlockLists->Free
FreeLists[InPoolIndex].PushToFront
FreeLists是FFreeBlockList类型的成员变量。
FreeExternal函数
Malloc函数
MallocInline函数
BaseAllocator函数
根据平台不同, 返回对应的FMalloc内存分配器。 比如Windows平台默认返回TBB内存分配器
转发给MallocExternal函数 调用全局变量GMalloc->Malloc GMalloc的类型是FMalloc,是全局的内存分配器。 自然,具体是什么子类根据平台而定。
FPoolTable
记录了相同尺寸的内存池的表 保存了两个内存池的链表的头节点 一条记录还能用的内存池,一条记录已耗尽的内存池 如果有30种尺寸的内存池,一般也会有30个FPoolTable
FPoolList
保存了内存池指针的链表的节点 内部通过FPoolInfo *Front来指向 链表中的下一个内存池。
FPoolInfo
保存了一个内存池应有的信息 包括:池中已分配元素的数量 已分配的字节数,指向下一个池的指针 指向池中第一个可用内存的指针 等等
FFreeBlock
内存池中空闲内存块的信息 指出了自身的大小,下一个空闲块的位置 所在内存池的索引,自身是几个内存块的集合等等。
FPerThreadFreeBlockLists
线程分配缓存列表 保存了与内存池尺寸种类的数目相同的内存块链表 分配内存时从缓冲中分配,避免了线程不安全
FFreeBlockList
类比FPoolTable。 一个线程会拥有45个该类的实例 每个实例都会保存对应尺寸的 内存块链表
FBundle
内存块的链表 翻译为“内存束” 可以类比成内存池
FBundleNode
内存块链表上的节点,存有next指针 相比FFreeBlock几乎没给任何信息
FPoolTables[45]
16字节
内存池1
内存池2
内存池3
32字节
内存池4
内存池5
48字节
64字节
…………
整个游戏中会有45种尺寸的内存池。每一种具体有多少个内存池不得而知。每一个线程都会将每一种尺寸的内存池各持有一个。分配内存时就从自己拥有的内存池中,从内存块链表上取一块内存下来返回,避免了多个线程之间的竞争。
猜想:FBundleNode类比对应的是FFreeBlock,都是指内存块,毕竟在FreeBundles函数中我们也可以看到二者的类型转换。
而FBundle对应的是FPoolInfo,也就是内存池级。二者都将空闲的内存块链接了起来。 FFreeBlockList对应的是FPoolTable & FPoolList级。因为对于线程分配缓存而言,并不像全局中拥有多个相同大小的内存池,对于单个线程而言,每种大小的内存池只会拥有一个。因此相比整个游戏的内存池结构而言会少一级。
现在的疑惑在于:
1、为什么FreeExternal函数调用的Private::FreeBundles函数 会把整个内存池都释放掉?你不是只释放掉一个内存块的吗? 2、FBundleNode的结构: 什么是当前内存束中的下一个内存块,另一个 “下一个内存块”又给我和count装在union里?count又指的是什么?
FPaddedBundlePointer
DefaultConstructItems