Prechádzať zdrojové kódy

feat: 新建内存相关文档

NiceTry12138 6 mesiacov pred
rodič
commit
8a496aac17
2 zmenil súbory, kde vykonal 72 pridanie a 0 odobranie
  1. 0 0
      UE5/内存/GC/README.md
  2. 72 0
      UE5/内存/Malloc/README.md

+ 0 - 0
UE5/内存/GC/README.md


+ 72 - 0
UE5/内存/Malloc/README.md

@@ -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
+
+