ページ 11

無題

Posted: 2010年7月18日(日) 20:27
by メモリマネージャー
今メモリマネージャーを作っているのですが
最初に大きく作った領域からメモリを割り当てる方法がよく分かりません
よろしかったら教えていただけませんか?

Re:無題

Posted: 2010年7月18日(日) 22:18
by めるぽん
どういうメモリマネージャを作ろうとしているのかによると思いますけど、
汎用的(固定サイズではなく、様々な大きさのメモリを確保できる)なものであれば、
フリーリストで繋いでいくのが一般的ですかね。

Re:無題

Posted: 2010年7月19日(月) 13:35
by へろりくしょん
最初に大きく作った領域からというのは、この時点ですでに確保していると解釈出来るのですが。 よく分かりません。

最初に大量に確保しておいて、少しずつ使っていく。 というのであれば。

char *buf = malloc(100000);
int *hoge = (int*)&buf[300];

とかいう風にするのもアリですか。


昔々、マクロ言語のコンパイラを作った時は、構文木用のメモリにこの方法を使いました。
いらなくなったらまとめて一気に解放出来るので楽です。
深い階層で文法エラー等が発生した時に、longjmp() で一気に戻ってくる設計でしたので。


ただし、確保と削除を頻繁に行うのには不向きですね。
内部で断片化しますし、ギャップバッファで実装してもオーバーヘッドが高そうです。


やっぱりリストが一番だと思いますよ。