dcdd144598 2011-02-23 kinaba: #ifndef _KILIB_MEMORY_H_ dcdd144598 2011-02-23 kinaba: #define _KILIB_MEMORY_H_ dcdd144598 2011-02-23 kinaba: #include "types.h" dcdd144598 2011-02-23 kinaba: #include "thread.h" dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace ki { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // W版ではHeapAllocを直接呼び出すバージョンを使う dcdd144598 2011-02-23 kinaba: //#if !defined(_UNICODE) && defined(SUPERTINY) dcdd144598 2011-02-23 kinaba: // #define USE_ORIGINAL_MEMMAN dcdd144598 2011-02-23 kinaba: //#endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 小規模と見なすオブジェクトの最大サイズ dcdd144598 2011-02-23 kinaba: #define SMALL_MAX 64 dcdd144598 2011-02-23 kinaba: // 一度に確保するヒープブロックのサイズ dcdd144598 2011-02-23 kinaba: #define BLOCK_SIZ 4096 dcdd144598 2011-02-23 kinaba: // 内部実装 dcdd144598 2011-02-23 kinaba: struct MemBlock; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg ki.Memory //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // メモリ割り当て・解放機構 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // SUPERTINYオプションを付けてコンパイルすると、標準の dcdd144598 2011-02-23 kinaba: // mallocやfreeを使えなくなるため、HeapAlloc等のAPIを dcdd144598 2011-02-23 kinaba: // 直接呼び出す必要が出てきます。しかし、こいつらを本当に dcdd144598 2011-02-23 kinaba: // 毎回直に呼んでいると、遅い。もうアホかと、バカかと、 dcdd144598 2011-02-23 kinaba: // って勢いで遅い。そこで、主にnewで動的に小規模メモリを dcdd144598 2011-02-23 kinaba: // 確保することに主眼を据えた簡単なアロケータを使うことにしました。 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // <a href="http://cseng.aw.com/book/0,3828,0201704315,00.html">loki</a> dcdd144598 2011-02-23 kinaba: // ライブラリほぼそのまんまな実装です。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class MemoryManager : public EzLockable dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メモリ割り当て //@} dcdd144598 2011-02-23 kinaba: void* Alloc( size_t siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メモリ解放 //@} dcdd144598 2011-02-23 kinaba: void DeAlloc( void* ptr, size_t siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #ifdef USE_ORIGINAL_MEMMAN dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: struct FixedSizeMemBlockPool dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: void Construct( byte siz ); dcdd144598 2011-02-23 kinaba: void Destruct(); dcdd144598 2011-02-23 kinaba: void* Alloc(); dcdd144598 2011-02-23 kinaba: void DeAlloc( void* ptr ); dcdd144598 2011-02-23 kinaba: bool isValid(); dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: MemBlock* blocks_; dcdd144598 2011-02-23 kinaba: int blockNum_; dcdd144598 2011-02-23 kinaba: int blockNumReserved_; dcdd144598 2011-02-23 kinaba: byte fixedSize_; dcdd144598 2011-02-23 kinaba: byte numPerBlock_; dcdd144598 2011-02-23 kinaba: int lastA_; dcdd144598 2011-02-23 kinaba: int lastDA_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: FixedSizeMemBlockPool pools_[ SMALL_MAX ]; dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: MemoryManager(); dcdd144598 2011-02-23 kinaba: ~MemoryManager(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static MemoryManager* pUniqueInstance_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: friend void APIENTRY Startup(); dcdd144598 2011-02-23 kinaba: friend inline MemoryManager& mem(); dcdd144598 2011-02-23 kinaba: NOCOPY(MemoryManager); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 唯一のメモリ管理オブジェクトを返す //@} dcdd144598 2011-02-23 kinaba: inline MemoryManager& mem() dcdd144598 2011-02-23 kinaba: { return *MemoryManager::pUniqueInstance_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ゼロ埋め作業 //@} dcdd144598 2011-02-23 kinaba: inline void mem00( void* ptrv, int siz ) dcdd144598 2011-02-23 kinaba: { BYTE* ptr = (BYTE*)ptrv; dcdd144598 2011-02-23 kinaba: for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0x00000000; dcdd144598 2011-02-23 kinaba: for(;siz;--siz,++ptr) *ptr = 0x00; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ FF埋め作業 //@} dcdd144598 2011-02-23 kinaba: inline void memFF( void* ptrv, int siz ) dcdd144598 2011-02-23 kinaba: { BYTE* ptr = (BYTE*)ptrv; dcdd144598 2011-02-23 kinaba: for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0xffffffff; dcdd144598 2011-02-23 kinaba: for(;siz;--siz,++ptr) *ptr = 0xff; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 標準基底クラス dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // JavaのObject や MFCのCObject みたいに使う…わけではなく、 dcdd144598 2011-02-23 kinaba: // 単にここから派生すると自動で operator new/delete が高速版に dcdd144598 2011-02-23 kinaba: // なるので便利だよ、という使い方のための基底クラスです。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: #ifdef USE_ORIGINAL_MEMMAN dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static void* operator new( size_t siz ) dcdd144598 2011-02-23 kinaba: { return mem().Alloc( siz ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static void operator delete( void* ptr, size_t siz ) dcdd144598 2011-02-23 kinaba: { mem().DeAlloc( ptr, siz ); } dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: protected: dcdd144598 2011-02-23 kinaba: virtual ~Object() dcdd144598 2011-02-23 kinaba: {} dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: } // namespace ki dcdd144598 2011-02-23 kinaba: #endif // _KILIB_MEMORY_H_