ややプログラム紀行

博士2年のプログラムに関する日記

久しぶりのTLSFネタ

題名通り久しぶりにTLSFについての記事を書きます

TLSF自体は1ヶ月ほど前に作りました

僕はやっとこさで完成させて「これから武器になるかな~」など思っていたわけですが、

問題はまだまだ有りました

①メモリ容量喰いすぎじゃね?!

TLSFアロケーターはある変数をブロックで包み込むことで扱いやすくしています

そのブロックの構成とは・・・(僕の場合。ほかの人と違うかも?)

①ブロックサイズ(unsigned size)

②フラグ(bool flag)

③自分と同じ容量で自分の1個前のブロックのポインター(BoundaryBlock* prev)

④自分と同じ容量で自分の1個後のブロックのポインター(BoundaryBlock* next)

⑤メモリ本体

⑥ブロックサイズ・後ろバージョン(unsigned endtag)

・・・とこんな感じです

正直多過ぎでしょー!

TLSFはメモリを犠牲にしてスピードを速めてるんでしょうね(多分)

③、④は少しわかりにくいですがサイトとかをみてくれたらわかると思います

僕の場合はこれでメモリ本体のサイズ+20バイトになりました

なんで20バイトなのか謎です

今のところはたまーに聞く、構造体などでサイズが思い通りにならないやつと同じと思ってますけど

こんど調べてみます

・・・と調べてたらあった

これですかね~?

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1355293703

アライメントがなんとか

とにかく20バイトはでかいかな・・・

②配列確保できねぇ・・・

これは(も)単純に僕の技術不足なんですが

配列が確保出来ません・・・(T_T)

メモリを確保するNew関数の引数は

New(T& Obj)

となっていて、実際に使う時は

New(int())

みたいのでなんとな~く通っていたんですが

配列でつまずきましたorz

C言語では配列はメモリ上では並んでいるものなので

TLSFみたいなものでは配列ごと包み込む必要があるんですが

それが出来ません・・・

1つずつやろうとすると①で述べたとおりメモリを喰いまくってしゃあないのでダメです

実用的ではないですがtypedefを使おうとしたら上の例でいうNew(int())のところで引っかかりました

今のところこれは全然解りませんので、解る方がいたらご教授願います・・・

とりあえず今はこの2つが最重要課題です