picox
0.1
|
Pico variable memory allocator. [詳解]
#include <picox/core/xcore.h>
データ構造 | |
struct | XPicoAllocator |
型定義 | |
typedef void(* | XPicoAllocatorWalker) (const uint8_t *chunk, size_t size, void *user) |
関数 | |
void * | xpalloc_allocate (XPicoAllocator *self, size_t size) |
size_t | xpalloc_allocation_overhead (const XPicoAllocator *self, size_t n) |
static size_t | xpalloc_capacity (const XPicoAllocator *self) |
void | xpalloc_clear (XPicoAllocator *self) |
void | xpalloc_deallocate (XPicoAllocator *self, void *ptr) |
void | xpalloc_deinit (XPicoAllocator *self) |
static uint8_t * | xpalloc_heap (const XPicoAllocator *self) |
bool | xpalloc_init (XPicoAllocator *self, void *heap, size_t size, size_t alignment) |
bool | xpalloc_is_owner (const XPicoAllocator *self, const void *ptr) |
static size_t | xpalloc_max_used (const XPicoAllocator *self) |
void * | xpalloc_reallocate (XPicoAllocator *self, void *old_mem, size_t size) |
static size_t | xpalloc_reserve (const XPicoAllocator *self) |
void | xpalloc_walk_heap (const XPicoAllocator *self, XPicoAllocatorWalker walker, void *user) |
Pico variable memory allocator.
最低限の機能を備えた可変長メモリアロケータです。最低限の機能というのは、 断片化対策を一切していないという意味です。色々なメモリアロケータのアルゴ リズム(TLSF, dlmalloc, etc..)では断片化しづらいようにしたり、断片化して も性能が劣化しないように等、色々と工夫を凝らしているようですが、小規模な 組み込み環境を想定した場合、最低限の機能で十分なことが多いと思われます。
また、復数のヒープを使って機能ごとに専用アロケータを用意する等、柔軟な使 い方ができる。ヒープの使用状況を確認できるインターフェースが用意されてい るといった点もこのモジュールの利点です。
実装も超シンプルなので、メモリアロケータ実装に興味のある人の入門用にも ピッタリでしょう。
@author MaskedW
typedef void(* XPicoAllocatorWalker) (const uint8_t *chunk, size_t size, void *user) |
ヒープの空きブロック走査用コールバック関数です
chunk | 空きブロックのポインタ |
size | 空きブロックのサイズ |
user | ユーザーデータポインタ |
void* xpalloc_allocate | ( | XPicoAllocator * | self, |
size_t | size | ||
) |
ヒープからsizeバイトのメモリを切り出して返します
size_t xpalloc_allocation_overhead | ( | const XPicoAllocator * | self, |
size_t | n | ||
) |
nバイトのメモリ確保を行った場合に必要な余分なメモリサイズを返します。
|
inlinestatic |
ヒープのサイズを返します
void xpalloc_clear | ( | XPicoAllocator * | self | ) |
ヒープを初期状態に戻します
void xpalloc_deallocate | ( | XPicoAllocator * | self, |
void * | ptr | ||
) |
ヒープにメモリを返却します
void xpalloc_deinit | ( | XPicoAllocator * | self | ) |
オブジェクトの終了処理を行います
|
inlinestatic |
ヒープメモリ自身を返します
bool xpalloc_init | ( | XPicoAllocator * | self, |
void * | heap, | ||
size_t | size, | ||
size_t | alignment | ||
) |
メモリブロックを初期化します
heap | heapとして利用するメモリ領域 |
size | heap領域のサイズ |
alignment | allocatorが返すメモリアドレスのアライメント |
heap == NULLの場合はsizeバイトのメモリをx_malloc()で確保します。
true | 初期化成功 |
false | メモリ確保失敗 |
alignmentには特殊なアラインメントが必要な時以外はX_ALIGN_OF(XMaxAlign)を指定 しておくのが無難です。例えば文字列等のバイトデータしか扱わないということがわ かっているなら、アライメントを1とすることができますが、管理データの格納用に 内部的には最低でもX_ALIGN_OF(size_t)まで、切り上げが行われます。
bool xpalloc_is_owner | ( | const XPicoAllocator * | self, |
const void * | ptr | ||
) |
ポインタがヒープ領域の範囲内かどうかを返します。
|
inlinestatic |
ヒープの最大使用バイト数を返します
void* xpalloc_reallocate | ( | XPicoAllocator * | self, |
void * | old_mem, | ||
size_t | size | ||
) |
realloc()相当の処理を行います
|
inlinestatic |
空きメモリバイト数を返します
void xpalloc_walk_heap | ( | const XPicoAllocator * | self, |
XPicoAllocatorWalker | walker, | ||
void * | user | ||
) |
ヒープ内の空きブロックを走査し、ブロックごとにwalkerを呼び出します
デバッグ用です。walkerがデータを収集することで、断片化状況等を確認できます。
walker | 空きブロック検出毎に呼び出される関数 |
user | walker呼び出し時に渡されるポインタ |