MGL(Win32)
読み取り中…
検索中…
一致する文字列を見つけられません
mgl_memory_fixed_size_allocator.h
[詳解]
1// SPDX-License-Identifier: Zlib
2/* ------------------------------------------------------------------------- */
9/* ------------------------------------------------------------------------- */
10
11#ifndef INCGUARD_MGL_MEMORY_FIXED_SIZE_ALLOCATOR_H_1653211251
12#define INCGUARD_MGL_MEMORY_FIXED_SIZE_ALLOCATOR_H_1653211251
13
14#include <forward_list>
15#include <memory>
16#include <mutex>
17
18namespace MGL::Memory
19{
22{
23public:
25 struct Block
26 {
27 uintptr_t address;
29 };
30
32 struct Header
33 {
35
36 union
37 {
39 size_t requestSize;
40 };
41 };
42 static_assert(sizeof(Header) <= 16); // ヘッダサイズは16バイト以下でなければならない
43
44 bool Initialize(size_t blockSize, size_t blockCount) noexcept;
45
46 /* ------------------------------------------------------------------------- */
51 /* ------------------------------------------------------------------------- */
52 constexpr void SetAltAllocator(FixedSizeAllocator *altAllocator) noexcept
53 {
54 _altAllocator = altAllocator;
55 }
56
57 /* ------------------------------------------------------------------------- */
62 /* ------------------------------------------------------------------------- */
63 [[nodiscard]] constexpr size_t GetBlockSize() const noexcept
64 {
65 return _blockSize;
66 }
67
68 /* ------------------------------------------------------------------------- */
73 /* ------------------------------------------------------------------------- */
74 [[nodiscard]] constexpr size_t GetCapacity() const noexcept
75 {
76 return _blockCount;
77 }
78
79 /* ------------------------------------------------------------------------- */
84 /* ------------------------------------------------------------------------- */
85 size_t GetFreeCount() noexcept
86 {
87 const std::lock_guard lock(_mutex);
88 return _freeCount;
89 }
90
91 /* ------------------------------------------------------------------------- */
96 /* ------------------------------------------------------------------------- */
97 size_t GetUsedCount() noexcept
98 {
99 return GetCapacity() - GetFreeCount();
100 }
101
102 void *Allocate(size_t size) noexcept;
103 void Deallocate(void *buffer) noexcept;
104
105private:
106 size_t _blockSize{0};
107 size_t _blockCount{0};
108 std::unique_ptr<std::byte[]> _pool{nullptr};
109 size_t _poolSize{0};
110 std::unique_ptr<Block[]> _blockArray{nullptr};
111 Block *_topBlock{nullptr};
112 size_t _freeCount{0};
113 FixedSizeAllocator *_altAllocator{nullptr};
114
115 std::mutex _mutex;
116};
117} // namespace MGL::Memory
118
119#endif // INCGUARD_MGL_MEMORY_FIXED_SIZE_ALLOCATOR_H_1653211251
120
121// vim: et ts=4 sw=4 sts=4
固定サイズアロケータクラス
Definition mgl_memory_fixed_size_allocator.h:22
bool Initialize(size_t blockSize, size_t blockCount) noexcept
初期化
Definition mgl_memory_fixed_size_allocator.cc:25
void Deallocate(void *buffer) noexcept
デアロケート
Definition mgl_memory_fixed_size_allocator.cc:113
constexpr size_t GetCapacity() const noexcept
確保可能な最大数を取得
Definition mgl_memory_fixed_size_allocator.h:74
void * Allocate(size_t size) noexcept
アロケート
Definition mgl_memory_fixed_size_allocator.cc:73
size_t GetFreeCount() noexcept
利用可能なブロック数を取得
Definition mgl_memory_fixed_size_allocator.h:85
size_t GetUsedCount() noexcept
利用中のブロック数を取得
Definition mgl_memory_fixed_size_allocator.h:97
constexpr void SetAltAllocator(FixedSizeAllocator *altAllocator) noexcept
代替アロケータを設定
Definition mgl_memory_fixed_size_allocator.h:52
constexpr size_t GetBlockSize() const noexcept
ブロックサイズを取得
Definition mgl_memory_fixed_size_allocator.h:63
メモリブロック情報
Definition mgl_memory_fixed_size_allocator.h:26
Block * next
次のメモリブロック
Definition mgl_memory_fixed_size_allocator.h:28
uintptr_t address
メモリブロックのアドレス
Definition mgl_memory_fixed_size_allocator.h:27
ヘッダ情報
Definition mgl_memory_fixed_size_allocator.h:33
size_t requestSize
要求サイズ(固定サイズアロケータを使用しなかった場合)
Definition mgl_memory_fixed_size_allocator.h:39
Block * block
使用したメモリブロック(固定サイズアロケータを使用した場合)
Definition mgl_memory_fixed_size_allocator.h:38
FixedSizeAllocator * allocator
使用したアロケータ
Definition mgl_memory_fixed_size_allocator.h:34