picox  0.1
xpico_allocator.c ファイル
xpico_allocator.c の依存先関係図:

マクロ定義

#define X__ALIGN   (self->alignment)
 

関数

static void * X__Allocate (XPicoAllocator *self, size_t size)
 
static void X__Deallocate (XPicoAllocator *self, void *ptr, size_t size)
 
void * xpalloc_allocate (XPicoAllocator *self, size_t size)
 
size_t xpalloc_allocation_overhead (const XPicoAllocator *self, size_t n)
 
void xpalloc_clear (XPicoAllocator *self)
 
void xpalloc_deallocate (XPicoAllocator *self, void *ptr)
 
void xpalloc_deinit (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)
 
void * xpalloc_reallocate (XPicoAllocator *self, void *old_mem, size_t new_size)
 
void xpalloc_walk_heap (const XPicoAllocator *self, XPicoAllocatorWalker walker, void *user)
 

詳解

著者
MaskedW

関数詳解

void* xpalloc_allocate ( XPicoAllocator self,
size_t  size 
)

ヒープからsizeバイトのメモリを切り出して返します

事前条件
  • size > 0
size_t xpalloc_allocation_overhead ( const XPicoAllocator self,
size_t  n 
)

nバイトのメモリ確保を行った場合に必要な余分なメモリサイズを返します。

void xpalloc_clear ( XPicoAllocator self)

ヒープを初期状態に戻します

void xpalloc_deallocate ( XPicoAllocator self,
void *  ptr 
)

ヒープにメモリを返却します

事前条件
  • xpallloc_is_owner(self, ptr) == true
覚え書き
ptr == NULLの時は何もしません。
void xpalloc_deinit ( XPicoAllocator self)

オブジェクトの終了処理を行います

bool xpalloc_init ( XPicoAllocator self,
void *  heap,
size_t  size,
size_t  alignment 
)

メモリブロックを初期化します

引数
heapheapとして利用するメモリ領域
sizeheap領域のサイズ
alignmentallocatorが返すメモリアドレスのアライメント

heap == NULLの場合はsizeバイトのメモリをx_malloc()で確保します。

事前条件
  • heapをアライメント調整したあとのサイズ > 0
  • alignment == 2のべき乗
戻り値
true初期化成功
falseメモリ確保失敗
覚え書き
heapが指すアドレスはalignmentに切り上げられます。そのため、可能であればheap をあらかじめalignmentに合わせておくと無駄がありません。 また、alocation時にもalignmentに応じた切り上げが行われるので、sizeで指定した バイト数を余すことなく動的メモリとして使用することはできないことに注意してく ださい。

alignmentには特殊なアラインメントが必要な時以外はX_ALIGN_OF(XMaxAlign)を指定 しておくのが無難です。例えば文字列等のバイトデータしか扱わないということがわ かっているなら、アライメントを1とすることができますが、管理データの格納用に 内部的には最低でもX_ALIGN_OF(size_t)まで、切り上げが行われます。

bool xpalloc_is_owner ( const XPicoAllocator self,
const void *  ptr 
)

ポインタがヒープ領域の範囲内かどうかを返します。

void* xpalloc_reallocate ( XPicoAllocator self,
void *  old_mem,
size_t  size 
)

realloc()相当の処理を行います

void xpalloc_walk_heap ( const XPicoAllocator self,
XPicoAllocatorWalker  walker,
void *  user 
)

ヒープ内の空きブロックを走査し、ブロックごとにwalkerを呼び出します

デバッグ用です。walkerがデータを収集することで、断片化状況等を確認できます。

引数
walker空きブロック検出毎に呼び出される関数
userwalker呼び出し時に渡されるポインタ