« メモリのアロケート malloc について | メイン | メモリアロケートを計ってみる »

2007年12月17日

基本テクニック:: 固定サイズメモリのアロケート

    

メモリのアロケート malloc について で malloc のアルゴリズムについて書いたが、見るからに遅そうだ。
サイズが固定の場合、より高速にメモリの確保と開放が出来る。
ソースは以下のような感じ。
これまたテストしていないので、使う場合はテストした方がいい。

//! @file ArraiedAllocator.h

#ifndef __ARRAYIED_ALLOCATOR_H__
#define __ARRAYIED_ALLOCATOR_H__

template< int TTypeSize, int TNumArray>
class ArraiedAllocator
{
  static const int MAX_SIZE = TNumArray;
  struct Item {
    union {
      char         value_[TTypeSize];
      struct Item* next_;
    };
  };
  static Item  items_[MAX_SIZE];
  static Item* first_;
  static ArraiedAllocator allocator_;
  ArraiedAllocator();

public:
  static void* Alloc() {
    Item* ret = first_;
    first_ = ret->next_;
    return reinterpret_cast<void*>(ret);
  }
  static void Free(void* item) {
    Item* rev = reinterpret_cast<Item*>(item);
    rev->next_ = first_;
    first_ = rev;
  }
  static ArraiedAllocator& GetAllocator() { return allocator_; }
  static int Max() { return MAX_SIZE; }
};

template< int TTypeSize, int TNumArray>
typename ArraiedAllocator<TTypeSize,TNumArray>::Item ArraiedAllocator<TTypeSize,TNumArray>::items_[ArraiedAllocator<TTypeSize,TNumArray>::MAX_SIZE];

template< int TTypeSize, int TNumArray>
typename ArraiedAllocator<TTypeSize, TNumArray>::Item* ArraiedAllocator<TTypeSize,TNumArray>::first_;

template< int TTypeSize, int TNumArray>
ArraiedAllocator<TTypeSize,TNumArray> ArraiedAllocator<TTypeSize,TNumArray>::allocator_;

template< int TTypeSize, int TNumArray>
ArraiedAllocator<TTypeSize,TNumArray>::ArraiedAllocator()
{
  first_ = &items_[0];
  forint i = 0; i < TNumArray; ++i ) {
    items_[i].next_ = &items_[i+1];
  }
  items_[TNumArray-1].next_ = NULL;
}

#endif // __ARRAYIED_ALLOCATOR_H__

ソースは見るからに単純で速そう。
まあ、サイズが固定だからなのだが。


関連記事・続きの記事

メモリアロケートを計ってみる
メモリのアロケート malloc について や 固定サイズメモリのアロケート を... [続きを読む]


投稿者 Takenori : 2007年12月17日 01:07




comments powered by Disqus
Total : Today : Yesterday : なかのひと