导图社区 UE4 FMemory 内存管理机制
UE4 FMemory 内存管理机制,包括:FMemory、FGenericPlatformMemoryFMalloc、FMalloc、FGenericPlatformMemoryFMemory、FMemory、FGenericPlatformMemoryFMalloc、FMalloc、 FGenericPlatformMemoryFMemory。
社区模板帮助中心,点此进入>>
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
内存块的链表 翻译为“内存束” 可以类比成内存池