[633] Re:メモリ管理モジュール(MEM)について
投稿者:(ぱ)
2007/02/20 02:13:25
>エイトと申します。
はじめまして。
>MEM.h の、MEM_Controller は、要は各メモリの根っこやエラー時の動作を握ってる
>構造体ですよね。
>実体は memory.c に記載され、アプリ側には不確定形で公開していますよね。
>つまりアプリ側にはどうやったって構造が見えない形になってます。
そうです。
>しかし、MMS_CONTROLLER がdefine されると、defineされた値をMEM_xxx_func で
>持ちまわる事が可能になるわけですよね。
>これの利点というか、アプリに選択肢を与えてる理由って、なんでしょうか。
おっしゃる通り、MEM_Controllerは、各メモリの根っこやエラー時の動作を握っています。
で、MEMの上位のプログラムが複数の部分(モジュール)から構成されている場合、
モジュールごとに、メモリの根っこやエラー時の動作を変えたいと思うかもしれません。
たとえば、crowbarを組み込んだアプリケーションを作るとして、そのアプリケーション
側でもMEMを使うとしたら、独立したMEM_Controllerを使いたいのではないでしょうか。
たとえばデバッグのためにMEM_dump_blocks()を呼ぶとして、crowbarで使っている
メモリの情報まで吐かれても邪魔です。
MEM_Controllerは不完全型でその内容は隠されていますが、MEM_create_controllerで
独立したMEM_Controllerを取得することが出来ます。
また、独立したControllerを使わせたいなら、MEM_malloc()などで引数として
MEM_Controllerを渡すという手もありますが、
引数が増えると面倒ですし、実際にはひとつのMEM_Controllerで済むことが
多いでしょうし、独立したMEM_Storageが使いたいという場合でも、たいていは.c単位で
切り替えられれば充分じゃないかなあ、と考えて、こういう実装になっています。
ただし根っこを静的に押さえているのでマルチスレッドなどを考えると問題になる
かもしれません。
# ていうかそれ以前に、複数のMEM_Controllerを使うテストはしてないので、
# ちゃんと動くかどうかは定かではないですが f(^^;
>MMS_malloc_func 等を個別で呼べなくなるというデメリットはありますが
>MEM_Storage に突っ込んで、アプリに見せなくさせるのも一考かなと思ってますが
>いかがでしょうか。
うーん、MEM_Storageは使わない関数もあるので、アプリに見えなくするなら
mem_default_controllerにstatic指定を付けてmemory.c以外からは見えなくしてしまう
ことになるんでしょうけど。
>2.
>memory.c 内に定義されているHeader_tag が、union で定義されているのはなぜでしょうか?
>Alignの存在する意味がわからないです。
アライメントを取るためです。
たいていのCPUでは、データ型によって、たとえばdoubleは8バイト刻みの領域にしか
配置できないなどの制限があります。
MEM_malloc()で確保された領域には、何が格納されるかわかりませんから、
MEM_malloc()はもっとも厳しい型で境界調整された領域を返す必要があります。
Alignは、その境界調整を行うための共用体です。
このあたりのことは、「プログラミング言語C」(いわゆるK&R)でサンプル実装している
malloc()でも考慮されていますので、K&Rをお持ちであればそちらも参考にしてください。
こんな感じで回答になっていますでしょうか?
追加の疑問点等ありましたらまたお気軽にどうぞ。