[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
本当にどうなってんのっていう寒さに体がついていきません。
運動しなきゃなぁ…。
皆さん突然の運動によるぎっくり腰には注意しましょうね。
はい、というわけで手作りアロケータ続きやっていきます。
メモリ確保のNew機能を実装しましょう。手順としては
1、メモリから空き要素を探す
2、空き要素を必要な分だけ使用中にする。
はい、これだけです。
んで、ここで問題です。ここでいうメモリはどこにあるんでしょうね。
この場合の正解は「どこにもない」です。作ってないですからね。
なのでまずメモリを作りましょう。
プログラム |
namespace Allocater{ class MemoryPool{ private: void* memoryPool; uint memoryPoolSize; public: // ポインタのNULL初期化は忘れない事。 MemoryPool() : memoryPool(NULL){} // 解放忘れてたら教えてもらう。 ~MemoryPool() { if( memoryPool ){ DEBUG_ERROR_PRINT("解放忘れ!"); } } // メモリを確保する void Init(uint size) { // どこかで使っているかもしれないので解放しない // NULLのときだけ確保を許可する if( memoryPool == NULL ){ memoryPoolSize = size; memoryPool = malloc(size); } }; // メモリを解放する void Release() { if( memoryPool ){ memoryPoolSize = 0; free( memoryPool ); memoryPool = NULL; } } }; }/* Allocater */ |
今日は雨が降ってたんだが途中から雪に。
半端ない寒さに家から出たくない毎日です。
さて、話題もないし適当な話でも。
最近は自作のメモリプールが欲しくなることがあって、
でもあまり時間かけられないっていうことで
上っ面なメモリプールでも作ることにします。
(上っ面なっていうのはアセンブリとかしませんよってことです)
画期的な確保とか超高速化は特に目指してません。
(大きなメモリ確保は勝手に早くなるだろうけど。)
目標は解放確認と好き勝手カスタマイズして遊びたいって感じです。
イメージとしては関数手続き型です。
C言語のmallocみたいなイメージ。
アロケータ |
namespace Allocater{ //--------------------------------------------------------------------------- // 領域を確保する。New<int>()とかNew<MyStruct>()とか //--------------------------------------------------------------------------- template<class T> T* New<T>(); //--------------------------------------------------------------------------- // 領域を解放する。 //--------------------------------------------------------------------------- void Delete(void* ptr); }/*Allocater*/ |