Merge pull request #100145 from Ivorforce/memory-offset-func
Add `mem_aligned_address` to simplify data offset constants.
This commit is contained in:
@ -50,9 +50,9 @@ public:
|
|||||||
// └─────────────────┴──┴────────────────┴──┴───────────...
|
// └─────────────────┴──┴────────────────┴──┴───────────...
|
||||||
// Offset: ↑ SIZE_OFFSET ↑ ELEMENT_OFFSET ↑ DATA_OFFSET
|
// Offset: ↑ SIZE_OFFSET ↑ ELEMENT_OFFSET ↑ DATA_OFFSET
|
||||||
|
|
||||||
static constexpr size_t SIZE_OFFSET = 0;
|
static const size_t SIZE_OFFSET;
|
||||||
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)));
|
static const size_t ELEMENT_OFFSET;
|
||||||
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)));
|
static const size_t DATA_OFFSET;
|
||||||
|
|
||||||
template <bool p_ensure_zero = false>
|
template <bool p_ensure_zero = false>
|
||||||
static void *alloc_static(size_t p_bytes, bool p_pad_align = false);
|
static void *alloc_static(size_t p_bytes, bool p_pad_align = false);
|
||||||
@ -87,8 +87,19 @@ public:
|
|||||||
static uint64_t get_mem_available();
|
static uint64_t get_mem_available();
|
||||||
static uint64_t get_mem_usage();
|
static uint64_t get_mem_usage();
|
||||||
static uint64_t get_mem_max_usage();
|
static uint64_t get_mem_max_usage();
|
||||||
|
|
||||||
|
static constexpr size_t get_aligned_address(size_t p_address, size_t p_alignment);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr size_t Memory::get_aligned_address(size_t p_address, size_t p_alignment) {
|
||||||
|
const size_t n_bytes_unaligned = p_address % p_alignment;
|
||||||
|
return (n_bytes_unaligned == 0) ? p_address : (p_address + p_alignment - n_bytes_unaligned);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline constexpr size_t Memory::SIZE_OFFSET = 0;
|
||||||
|
inline constexpr size_t Memory::ELEMENT_OFFSET = get_aligned_address(SIZE_OFFSET + sizeof(uint64_t), alignof(uint64_t));
|
||||||
|
inline constexpr size_t Memory::DATA_OFFSET = get_aligned_address(ELEMENT_OFFSET + sizeof(uint64_t), alignof(max_align_t));
|
||||||
|
|
||||||
class DefaultAllocator {
|
class DefaultAllocator {
|
||||||
public:
|
public:
|
||||||
_FORCE_INLINE_ static void *alloc(size_t p_memory) { return Memory::alloc_static(p_memory, false); }
|
_FORCE_INLINE_ static void *alloc(size_t p_memory) { return Memory::alloc_static(p_memory, false); }
|
||||||
|
|||||||
@ -60,8 +60,8 @@ private:
|
|||||||
// Offset: ↑ REF_COUNT_OFFSET ↑ SIZE_OFFSET ↑ DATA_OFFSET
|
// Offset: ↑ REF_COUNT_OFFSET ↑ SIZE_OFFSET ↑ DATA_OFFSET
|
||||||
|
|
||||||
static constexpr size_t REF_COUNT_OFFSET = 0;
|
static constexpr size_t REF_COUNT_OFFSET = 0;
|
||||||
static constexpr size_t SIZE_OFFSET = ((REF_COUNT_OFFSET + sizeof(SafeNumeric<USize>)) % alignof(USize) == 0) ? (REF_COUNT_OFFSET + sizeof(SafeNumeric<USize>)) : ((REF_COUNT_OFFSET + sizeof(SafeNumeric<USize>)) + alignof(USize) - ((REF_COUNT_OFFSET + sizeof(SafeNumeric<USize>)) % alignof(USize)));
|
static constexpr size_t SIZE_OFFSET = Memory::get_aligned_address(REF_COUNT_OFFSET + sizeof(SafeNumeric<USize>), alignof(USize));
|
||||||
static constexpr size_t DATA_OFFSET = ((SIZE_OFFSET + sizeof(USize)) % alignof(max_align_t) == 0) ? (SIZE_OFFSET + sizeof(USize)) : ((SIZE_OFFSET + sizeof(USize)) + alignof(max_align_t) - ((SIZE_OFFSET + sizeof(USize)) % alignof(max_align_t)));
|
static constexpr size_t DATA_OFFSET = Memory::get_aligned_address(SIZE_OFFSET + sizeof(USize), alignof(max_align_t));
|
||||||
|
|
||||||
mutable T *_ptr = nullptr;
|
mutable T *_ptr = nullptr;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user