UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MemStack.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "CoreGlobals.h"
8#include "CoreTypes.h"
9#include "HAL/MemoryBase.h"
10#include "HAL/PlatformCrt.h"
12#include "HAL/ThreadSingleton.h"
13#include "HAL/UnrealMemory.h"
16#include "Misc/Build.h"
17#include "Misc/NoopCounter.h"
20
21
22// Enums for specifying memory allocation type.
24{
25 MEM_Zeroed = 1
26};
27
28
30{
31 MEM_Oned = 1
32};
33
34
36{
37public:
38 enum
39 {
40 PageSize = 64 * 1024,
41 SmallPageSize = 1024-16 // allow a little extra space for allocator headers, etc
42 };
43#if UE_BUILD_SHIPPING
45#else
47#endif
48
49 static CORE_API FPageAllocator& Get();
50
52 CORE_API void* Alloc(int32 Alignment = MIN_ALIGNMENT);
53 CORE_API void Free(void* Mem);
54 CORE_API void* AllocSmall();
55 CORE_API void FreeSmall(void* Mem);
59private:
60
61 static FPageAllocator* Instance;
62 static FPageAllocator& Construct();
64
65#if STATS
66 void UpdateStats();
67#endif
68 TPageAllocator TheAllocator;
69};
70
71
77class FMemStackBase //-V1062
78{
79public:
80 enum class EPageSize : uint8
81 {
82 // Small pages are allocated unless the allocation requires a larger page.
83 Small,
84
85 // Large pages are always allocated.
86 Large
87 };
88
90
91 FMemStackBase(const FMemStackBase&) = delete;
93 {
94 *this = MoveTemp(Other);
95 }
96
98 {
99 FreeChunks(nullptr);
100 Top = Other.Top;
101 End = Other.End;
102 TopChunk = Other.TopChunk;
103 TopMark = Other.TopMark;
104 NumMarks = Other.NumMarks;
105 bShouldEnforceAllocMarks = Other.bShouldEnforceAllocMarks;
106 Other.Top = nullptr;
107 Other.End = nullptr;
108 Other.TopChunk = nullptr;
109 Other.NumMarks = 0;
110 Other.bShouldEnforceAllocMarks = false;
111 return *this;
112 }
113
115 {
116 check((GIsCriticalError || !NumMarks));
117 FreeChunks(nullptr);
118 }
119
120 UE_FORCEINLINE_HINT uint8* PushBytes(size_t AllocSize, size_t Alignment)
121 {
122 return (uint8*)Alloc(AllocSize, FMath::Max(AllocSize >= 16 ? (size_t)16 : (size_t)8, Alignment));
123 }
124
125 inline bool CanFitInPage(size_t AllocSize, size_t Alignment) const
126 {
127 const uint8* Result = Align(Top, Alignment);
128 const uint8* NewTop = Result + AllocSize;
129 return NewTop <= End;
130 }
131
132 inline void* Alloc(size_t AllocSize, size_t Alignment)
133 {
134 // Debug checks.
135 checkSlow(AllocSize>=0);
136 checkSlow((Alignment&(Alignment-1))==0);
137 checkSlow(Top<=End);
138 check(!bShouldEnforceAllocMarks || NumMarks > 0);
139
140 // Try to get memory from the current chunk.
141 uint8* Result = Align( Top, Alignment );
142 uint8* NewTop = Result + AllocSize;
143
144 // Make sure we didn't overflow.
145 if ( NewTop <= End )
146 {
147 Top = NewTop;
148 }
149 else
150 {
151 // We'd pass the end of the current chunk, so allocate a new one.
152 AllocateNewChunk( AllocSize + Alignment );
153 Result = Align( Top, Alignment );
154 NewTop = Result + AllocSize;
155 Top = NewTop;
156 }
157 return Result;
158 }
159
161 {
162 return Top;
163 }
164
167 {
168 return TopChunk == nullptr;
169 }
170
171 inline void Flush()
172 {
173 check(!NumMarks);
174 FreeChunks(nullptr);
175 }
177 {
178 return NumMarks;
179 }
182
183 // Returns true if the pointer was allocated using this allocator
184 CORE_API bool ContainsPointer(const void* Pointer) const;
185
186 // Friends.
187 friend class FMemMark;
188 friend void* operator new(size_t Size, FMemStackBase& Mem, int32 Count);
189 friend void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, int32 Count);
190 friend void* operator new(size_t Size, FMemStackBase& Mem, EMemZeroed Tag, int32 Count);
191 friend void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemZeroed Tag, int32 Count);
192 friend void* operator new(size_t Size, FMemStackBase& Mem, EMemOned Tag, int32 Count);
193 friend void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemOned Tag, int32 Count);
194 friend void* operator new[](size_t Size, FMemStackBase& Mem, int32 Count);
195 friend void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, int32 Count);
196 friend void* operator new[](size_t Size, FMemStackBase& Mem, EMemZeroed Tag, int32 Count);
197 friend void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemZeroed Tag, int32 Count);
198 friend void* operator new[](size_t Size, FMemStackBase& Mem, EMemOned Tag, int32 Count);
199 friend void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemOned Tag, int32 Count);
200
201 // Types.
203 {
206
207 uint8 *Data() const
208 {
209 return ((uint8*)this) + sizeof(FTaggedMemory);
210 }
211 };
212
213private:
214
219 CORE_API void AllocateNewChunk( int32 MinSize );
220
222 CORE_API void FreeChunks( FTaggedMemory* NewTopChunk );
223
224 // Variables.
225 uint8* Top = nullptr; // Top of current chunk (Top<=End).
226 uint8* End = nullptr; // End of current chunk.
227 FTaggedMemory* TopChunk = nullptr; // Only chunks 0..ActiveChunks-1 are valid.
228
230 class FMemMark* TopMark = nullptr;
231
233 int32 NumMarks = 0;
234
236 EPageSize PageSize = EPageSize::Small;
237
238protected:
240};
241
243
245{
246public:
248 {
249 bShouldEnforceAllocMarks = true;
250 }
251};
252
253
254/*-----------------------------------------------------------------------------
255 FMemStack templates.
256-----------------------------------------------------------------------------*/
257
258// Operator new for typesafe memory stack allocation.
259template <class T> inline T* New(FMemStackBase& Mem, int32 Count = 1, int32 Align = DEFAULT_ALIGNMENT)
260{
261 return (T*)Mem.PushBytes( Count*sizeof(T), Align );
262}
263template <class T> inline T* NewZeroed(FMemStackBase& Mem, int32 Count = 1, int32 Align = DEFAULT_ALIGNMENT)
264{
265 uint8* Result = Mem.PushBytes( Count*sizeof(T), Align );
266 FMemory::Memzero( Result, Count*sizeof(T) );
267 return (T*)Result;
268}
269template <class T> inline T* NewOned(FMemStackBase& Mem, int32 Count = 1, int32 Align = DEFAULT_ALIGNMENT)
270{
271 uint8* Result = Mem.PushBytes( Count*sizeof(T), Align );
272 FMemory::Memset( Result, 0xff, Count*sizeof(T) );
273 return (T*)Result;
274}
275
276
277/*-----------------------------------------------------------------------------
278 FMemStack operator new's.
279-----------------------------------------------------------------------------*/
280
281// Operator new for typesafe memory stack allocation.
282inline void* operator new(size_t Size, FMemStackBase& Mem, int32 Count = 1)
283{
284 // Get uninitialized memory.
285 const size_t SizeInBytes = Size * Count;
286 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
287 return Mem.PushBytes( SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
288}
289inline void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, int32 Count = 1) // c++17
290{
291 // Get uninitialized memory.
292 const size_t SizeInBytes = Size * Count;
293 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
294 return Mem.PushBytes(SizeInBytes, (size_t)Align);
295}
296inline void* operator new(size_t Size, FMemStackBase& Mem, EMemZeroed Tag, int32 Count = 1)
297{
298 // Get zero-filled memory.
299 const size_t SizeInBytes = Size * Count;
300 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
301 uint8* Result = Mem.PushBytes( SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
302 FMemory::Memzero( Result, SizeInBytes );
303 return Result;
304}
305inline void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemZeroed Tag, int32 Count = 1) // c++17
306{
307 // Get zero-filled memory.
308 const size_t SizeInBytes = Size * Count;
309 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
310 uint8* Result = Mem.PushBytes(SizeInBytes, (size_t)Align);
311 FMemory::Memzero(Result, SizeInBytes);
312 return Result;
313}
314inline void* operator new(size_t Size, FMemStackBase& Mem, EMemOned Tag, int32 Count = 1)
315{
316 // Get one-filled memory.
317 const size_t SizeInBytes = Size * Count;
318 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
319 uint8* Result = Mem.PushBytes( SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
320 FMemory::Memset( Result, 0xff, SizeInBytes );
321 return Result;
322}
323inline void* operator new(size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemOned Tag, int32 Count = 1) // c++17
324{
325 // Get one-filled memory.
326 const size_t SizeInBytes = Size * Count;
327 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
328 uint8* Result = Mem.PushBytes(SizeInBytes, (size_t)Align);
329 FMemory::Memset(Result, 0xff, SizeInBytes);
330 return Result;
331}
332inline void* operator new[](size_t Size, FMemStackBase& Mem, int32 Count = 1)
333{
334 // Get uninitialized memory.
335 const size_t SizeInBytes = Size * Count;
336 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
337 return Mem.PushBytes( SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
338}
339inline void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, int32 Count = 1) // c++17
340{
341 // Get uninitialized memory.
342 const size_t SizeInBytes = Size * Count;
343 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
344 return Mem.PushBytes(SizeInBytes, (size_t)Align);
345}
346inline void* operator new[](size_t Size, FMemStackBase& Mem, EMemZeroed Tag, int32 Count = 1)
347{
348 // Get zero-filled memory.
349 const size_t SizeInBytes = Size * Count;
350 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
351 uint8* Result = Mem.PushBytes(SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
352 FMemory::Memzero( Result, SizeInBytes );
353 return Result;
354}
355inline void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemZeroed Tag, int32 Count = 1) // c++17
356{
357 // Get zero-filled memory.
358 const size_t SizeInBytes = Size * Count;
359 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
360 uint8* Result = Mem.PushBytes(SizeInBytes, (size_t)Align);
361 FMemory::Memzero(Result, SizeInBytes);
362 return Result;
363}
364inline void* operator new[](size_t Size, FMemStackBase& Mem, EMemOned Tag, int32 Count = 1)
365{
366 // Get one-filled memory.
367 const size_t SizeInBytes = Size * Count;
368 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
369 uint8* Result = Mem.PushBytes( SizeInBytes, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
370 FMemory::Memset( Result, 0xff, SizeInBytes );
371 return Result;
372}
373inline void* operator new[](size_t Size, std::align_val_t Align, FMemStackBase& Mem, EMemOned Tag, int32 Count = 1) // c++17
374{
375 // Get one-filled memory.
376 const size_t SizeInBytes = Size * Count;
377 checkSlow(SizeInBytes <= (size_t)TNumericLimits<int32>::Max());
378 uint8* Result = Mem.PushBytes(SizeInBytes, (size_t)Align);
379 FMemory::Memset(Result, 0xff, SizeInBytes);
380 return Result;
381}
382
383namespace UE::Core::Private
384{
386}
387
389template<uint32 Alignment = DEFAULT_ALIGNMENT>
391{
392public:
394
395 enum { NeedsElementType = true };
396 enum { RequireRangeCheck = true };
397
398 template<typename ElementType>
400 {
401 public:
402
405 Data(nullptr)
406 {}
407
414 {
415 checkSlow(this != &Other);
416
417 Data = Other.Data;
418 Other.Data = nullptr;
419 }
420
421 // FContainerAllocatorInterface
423 {
424 return Data;
425 }
426
427 //@TODO: FLOATPRECISION: Takes SIZE_T input but doesn't actually support it
428 void ResizeAllocation(SizeType CurrentNum, SizeType NewMax,SIZE_T NumBytesPerElement)
429 {
430 void* OldData = Data;
431 if( NewMax )
432 {
433 static_assert(sizeof(int32) <= sizeof(SIZE_T), "SIZE_T is expected to be larger than int32");
434
435 // Check for under/overflow
437 {
439 }
440
441 // Allocate memory from the stack.
442 Data = (ElementType*)FMemStack::Get().PushBytes(
443 (int32)(NewMax * NumBytesPerElement),
444 FMath::Max(Alignment,(uint32)alignof(ElementType))
445 );
446
447 // If the container currently holds elements, copy them into the new allocation.
448 if(OldData && CurrentNum)
449 {
450 const SizeType NumCopiedElements = FMath::Min(NewMax,CurrentNum);
451 FMemory::Memcpy(Data,OldData,NumCopiedElements * NumBytesPerElement);
452 }
453 }
454 }
456 {
457 return DefaultCalculateSlackReserve(NewMax, NumBytesPerElement, false, Alignment);
458 }
460 {
461 return DefaultCalculateSlackShrink(NewMax, CurrentMax, NumBytesPerElement, false, Alignment);
462 }
464 {
465 return DefaultCalculateSlackGrow(NewMax, CurrentMax, NumBytesPerElement, false, Alignment);
466 }
467
468 UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(SizeType CurrentMax, SIZE_T NumBytesPerElement) const
469 {
470 return CurrentMax * NumBytesPerElement;
471 }
472
473 bool HasAllocation() const
474 {
475 return !!Data;
476 }
477
479 {
480 return 0;
481 }
482
483 private:
484
486 ElementType* Data;
487 };
488
490};
491
492template <uint32 Alignment>
493struct TAllocatorTraits<TMemStackAllocator<Alignment>> : TAllocatorTraitsBase<TMemStackAllocator<Alignment>>
494{
495 enum { IsZeroConstruct = true };
496};
497
498
506{
507public:
508 // Constructors.
510 : Mem(InMem)
511 , Top(InMem.Top)
512 , SavedChunk(InMem.TopChunk)
513 , bPopped(false)
514 , NextTopmostMark(InMem.TopMark)
515 {
516 Mem.TopMark = this;
517
518 // Track the number of outstanding marks on the stack.
519 Mem.NumMarks++;
520 }
521
524 {
525 Pop();
526 }
527
529 void Pop()
530 {
531 if(!bPopped)
532 {
533 check(Mem.TopMark == this);
534 bPopped = true;
535
536 // Track the number of outstanding marks on the stack.
537 --Mem.NumMarks;
538
539 // Unlock any new chunks that were allocated.
540 if( SavedChunk != Mem.TopChunk )
541 {
542 Mem.FreeChunks( SavedChunk );
543 }
544
545 // Restore the memory stack's state.
546 Mem.Top = Top;
547 Mem.TopMark = NextTopmostMark;
548
549 // Ensure that the mark is only popped once by clearing the top pointer.
550 Top = nullptr;
551 }
552 }
553
554private:
555
556 // Implementation variables.
557 FMemStackBase& Mem;
558 uint8* Top;
560 bool bPopped;
561 FMemMark* NextTopmostMark;
562};
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT SizeType DefaultCalculateSlackReserve(SizeType NewMax, SIZE_T BytesPerElement, bool bAllowQuantize, uint32 Alignment=DEFAULT_ALIGNMENT)
Definition ContainerAllocationPolicies.h:223
UE_FORCEINLINE_HINT SizeType DefaultCalculateSlackShrink(SizeType NewMax, SizeType CurrentMax, SIZE_T BytesPerElement, bool bAllowQuantize, uint32 Alignment=DEFAULT_ALIGNMENT)
Definition ContainerAllocationPolicies.h:139
UE_FORCEINLINE_HINT SizeType DefaultCalculateSlackGrow(SizeType NewMax, SizeType CurrentMax, SIZE_T BytesPerElement, bool bAllowQuantize, uint32 Alignment=DEFAULT_ALIGNMENT)
Definition ContainerAllocationPolicies.h:169
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
#define UNLIKELY(x)
Definition Platform.h:857
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T * NewOned(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:269
EMemOned
Definition MemStack.h:30
@ MEM_Oned
Definition MemStack.h:31
EMemZeroed
Definition MemStack.h:24
@ MEM_Zeroed
Definition MemStack.h:25
T * New(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:259
T * NewZeroed(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:263
@ MIN_ALIGNMENT
Definition MemoryBase.h:27
@ DEFAULT_ALIGNMENT
Definition MemoryBase.h:24
#define MAX_int32
Definition NumericLimits.h:25
#define UE_DECLARE_THREAD_SINGLETON_TLS(Type, Api)
Definition ThreadSingleton.h:35
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition MemStack.h:506
FMemMark(FMemStackBase &InMem)
Definition MemStack.h:509
void Pop()
Definition MemStack.h:529
~FMemMark()
Definition MemStack.h:523
Definition MemStack.h:78
UE_FORCEINLINE_HINT int32 GetNumMarks()
Definition MemStack.h:176
UE_FORCEINLINE_HINT bool IsEmpty() const
Definition MemStack.h:166
CORE_API bool ContainsPointer(const void *Pointer) const
Definition MemStack.cpp:398
UE_FORCEINLINE_HINT uint8 * GetTop() const
Definition MemStack.h:160
EPageSize
Definition MemStack.h:81
bool bShouldEnforceAllocMarks
Definition MemStack.h:239
void * Alloc(size_t AllocSize, size_t Alignment)
Definition MemStack.h:132
UE_FORCEINLINE_HINT uint8 * PushBytes(size_t AllocSize, size_t Alignment)
Definition MemStack.h:120
void Flush()
Definition MemStack.h:171
FMemStackBase(const FMemStackBase &)=delete
FMemStackBase & operator=(FMemStackBase &&Other)
Definition MemStack.h:97
FMemStackBase(FMemStackBase &&Other)
Definition MemStack.h:92
bool CanFitInPage(size_t AllocSize, size_t Alignment) const
Definition MemStack.h:125
CORE_API int32 GetByteCount() const
Definition MemStack.cpp:319
~FMemStackBase()
Definition MemStack.h:114
Definition MemStack.h:245
FMemStack()
Definition MemStack.h:247
Definition MemStack.h:36
CORE_API void * AllocSmall()
Definition MemStack.cpp:258
@ SmallPageSize
Definition MemStack.h:41
@ PageSize
Definition MemStack.h:40
CORE_API uint64 BytesUsed()
Definition MemStack.cpp:268
CORE_API uint64 BytesFree()
Definition MemStack.cpp:273
TLockFreeFixedSizeAllocator< PageSize, PLATFORM_CACHE_LINE_SIZE, FThreadSafeCounter > TPageAllocator
Definition MemStack.h:46
CORE_API void LatchProtectedMode()
Definition MemStack.cpp:280
CORE_API void FreeSmall(void *Mem)
Definition MemStack.cpp:263
static CORE_API FPageAllocator & Get()
Definition MemStack.cpp:30
CORE_API void * Alloc(int32 Alignment=MIN_ALIGNMENT)
Definition MemStack.cpp:236
CORE_API ~FPageAllocator()
Definition MemStack.cpp:25
Definition LockFreeFixedSizeAllocator.h:196
Definition MemStack.h:400
UE_FORCEINLINE_HINT SizeType CalculateSlackReserve(SizeType NewMax, SIZE_T NumBytesPerElement) const
Definition MemStack.h:455
ForElementType()
Definition MemStack.h:404
void MoveToEmpty(ForElementType &Other)
Definition MemStack.h:413
bool HasAllocation() const
Definition MemStack.h:473
UE_FORCEINLINE_HINT SizeType CalculateSlackShrink(SizeType NewMax, SizeType CurrentMax, SIZE_T NumBytesPerElement) const
Definition MemStack.h:459
UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(SizeType CurrentMax, SIZE_T NumBytesPerElement) const
Definition MemStack.h:468
SizeType GetInitialCapacity() const
Definition MemStack.h:478
UE_FORCEINLINE_HINT ElementType * GetAllocation() const
Definition MemStack.h:422
void ResizeAllocation(SizeType CurrentNum, SizeType NewMax, SIZE_T NumBytesPerElement)
Definition MemStack.h:428
UE_FORCEINLINE_HINT SizeType CalculateSlackGrow(SizeType NewMax, SizeType CurrentMax, SIZE_T NumBytesPerElement) const
Definition MemStack.h:463
Definition MemStack.h:391
@ NeedsElementType
Definition MemStack.h:395
@ RequireRangeCheck
Definition MemStack.h:396
ForElementType< FScriptContainerElement > ForAnyElementType
Definition MemStack.h:489
int32 SizeType
Definition MemStack.h:393
Definition ThreadSingleton.h:44
static FORCEINLINE FMemStack & Get()
Definition ThreadSingleton.h:101
implementation
Definition PlayInEditorLoadingScope.h:8
CORE_API void OnInvalidMemStackAllocatorNum(int32 NewNum, SIZE_T NumBytesPerElement)
Definition MemStack.cpp:415
@ false
Definition radaudio_common.h:23
Definition MemStack.h:203
uint8 * Data() const
Definition MemStack.h:207
FTaggedMemory * Next
Definition MemStack.h:204
int32 DataSize
Definition MemStack.h:205
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
static UE_FORCEINLINE_HINT void * Memset(void *Dest, uint8 Char, SIZE_T Count)
Definition UnrealMemory.h:119
Definition ContainerAllocationPolicies.h:247
@ IsZeroConstruct
Definition ContainerAllocationPolicies.h:248
Definition ContainerAllocationPolicies.h:256
Definition NumericLimits.h:41