@@ -50,9 +50,9 @@ class Memory {
5050 // └─────────────────┴──┴────────────────┴──┴───────────...
5151 // Offset: ↑ SIZE_OFFSET ↑ ELEMENT_OFFSET ↑ DATA_OFFSET
5252
53- static constexpr size_t SIZE_OFFSET = 0 ;
54- static constexpr size_t ELEMENT_OFFSET = ((SIZE_OFFSET + sizeof ( uint64_t )) % alignof ( uint64_t ) == 0 ) ? (SIZE_OFFSET + sizeof ( uint64_t )) : ((SIZE_OFFSET + sizeof ( uint64_t )) + alignof ( uint64_t ) - ((SIZE_OFFSET + sizeof ( uint64_t )) % alignof ( uint64_t ))) ;
55- static constexpr size_t DATA_OFFSET = ((ELEMENT_OFFSET + sizeof ( uint64_t )) % alignof ( max_align_t ) == 0 ) ? (ELEMENT_OFFSET + sizeof ( uint64_t )) : ((ELEMENT_OFFSET + sizeof ( uint64_t )) + alignof ( max_align_t ) - ((ELEMENT_OFFSET + sizeof ( uint64_t )) % alignof ( max_align_t ))) ;
53+ static const size_t SIZE_OFFSET;
54+ static const size_t ELEMENT_OFFSET;
55+ static const size_t DATA_OFFSET;
5656
5757 template <bool p_ensure_zero = false >
5858 static void *alloc_static (size_t p_bytes, bool p_pad_align = false );
@@ -87,8 +87,19 @@ class Memory {
8787 static uint64_t get_mem_available ();
8888 static uint64_t get_mem_usage ();
8989 static uint64_t get_mem_max_usage ();
90+
91+ static constexpr size_t get_aligned_address (size_t p_address, size_t p_alignment);
9092};
9193
94+ constexpr size_t Memory::get_aligned_address (size_t p_address, size_t p_alignment) {
95+ const size_t n_bytes_unaligned = p_address % p_alignment;
96+ return (n_bytes_unaligned == 0 ) ? p_address : (p_address + p_alignment - n_bytes_unaligned);
97+ }
98+
99+ inline constexpr size_t Memory::SIZE_OFFSET = 0 ;
100+ inline constexpr size_t Memory::ELEMENT_OFFSET = get_aligned_address(SIZE_OFFSET + sizeof (uint64_t ), alignof (uint64_t ));
101+ inline constexpr size_t Memory::DATA_OFFSET = get_aligned_address(ELEMENT_OFFSET + sizeof (uint64_t ), alignof (max_align_t ));
102+
92103class DefaultAllocator {
93104public:
94105 _FORCE_INLINE_ static void *alloc (size_t p_memory) { return Memory::alloc_static (p_memory, false ); }
0 commit comments