|
|
@@ -0,0 +1,72 @@
|
|
|
+# FMalloc
|
|
|
+
|
|
|
+## FMallocAnsi
|
|
|
+
|
|
|
+使用 `FMallocAnsi` 分配内存时,根据平台不同,调用不同平台的内存申请函数 `_aligned_malloc`、`memalign`、`malloc`
|
|
|
+
|
|
|
+```cpp
|
|
|
+void* FMallocAnsi::TryMalloc(SIZE_T Size, uint32 Alignment)
|
|
|
+{
|
|
|
+#if !UE_BUILD_SHIPPING
|
|
|
+ uint64 LocalMaxSingleAlloc = MaxSingleAlloc.Load(EMemoryOrder::Relaxed);
|
|
|
+ if (LocalMaxSingleAlloc != 0 && Size > LocalMaxSingleAlloc)
|
|
|
+ {
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ Alignment = FMath::Max(Size >= 16 ? (uint32)16 : (uint32)8, Alignment);
|
|
|
+
|
|
|
+ void* Result = AnsiMalloc(Size, Alignment);
|
|
|
+
|
|
|
+ return Result;
|
|
|
+}
|
|
|
+
|
|
|
+void* AnsiMalloc(SIZE_T Size, uint32 Alignment)
|
|
|
+{
|
|
|
+#if PLATFORM_USES__ALIGNED_MALLOC
|
|
|
+ void* Result = _aligned_malloc( Size, Alignment );
|
|
|
+#elif PLATFORM_USE_ANSI_POSIX_MALLOC
|
|
|
+ void* Result;
|
|
|
+ if (UNLIKELY(posix_memalign(&Result, Alignment, Size) != 0))
|
|
|
+ {
|
|
|
+ Result = nullptr;
|
|
|
+ }
|
|
|
+#elif PLATFORM_USE_ANSI_MEMALIGN
|
|
|
+ void* Result = memalign(Alignment, Size);
|
|
|
+#else
|
|
|
+ void* Ptr = malloc(Size + Alignment + sizeof(void*) + sizeof(SIZE_T));
|
|
|
+ void* Result = nullptr;
|
|
|
+ if (Ptr)
|
|
|
+ {
|
|
|
+ Result = Align((uint8*)Ptr + sizeof(void*) + sizeof(SIZE_T), Alignment);
|
|
|
+ *((void**)((uint8*)Result - sizeof(void*))) = Ptr;
|
|
|
+ *((SIZE_T*)((uint8*)Result - sizeof(void*) - sizeof(SIZE_T))) = Size;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ return Result;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+释放内存也是,根据平台不同调用不同的释放函数 `_aligned_free`、`free`
|
|
|
+
|
|
|
+```cpp
|
|
|
+void AnsiFree(void* Ptr)
|
|
|
+{
|
|
|
+#if PLATFORM_USES__ALIGNED_MALLOC
|
|
|
+ _aligned_free(Ptr);
|
|
|
+#elif PLATFORM_USE_ANSI_POSIX_MALLOC || PLATFORM_USE_ANSI_MEMALIGN
|
|
|
+ free(Ptr);
|
|
|
+#else
|
|
|
+ if (Ptr)
|
|
|
+ {
|
|
|
+ free(*((void**)((uint8*)Ptr - sizeof(void*))));
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## FMallocBinned
|
|
|
+
|
|
|
+
|