[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
// メモリ確保
dword mem_alloc(MEMORY_MANAGE *man, dword size) {
dword i, a;
for(i= 0; i < man->frees; i++) {
// 十分な広さの空きを発見した場合
if(man->free[i].size >= size) {
a = man->free[i].address;
man->free[i].address += size;
man->free[i].size -= size;
// free[i]がなくなったので前に詰める
if(man->free[i].size == 0) {
man->frees--;
for(; i < man->frees; i++) man->free[i] = man->free[i+1];
}
return a;
}
}
return 0; // 空きがない
}
自作本から型名等を変えています。ただの好みですw
// メモリ解放
int mem_free(MEMORY_MANAGE *man, dword address, dword size) {
int i, j;
// 解放するメモリをどこに入れるか決める
for(i = 0; i < man->frees; i++) {
if(man->free[i].address > address) break;
}
// 前があるとき
if(i > 0) {
// 前の領域にまとめられるとき
if(man->free[i-1].address + man->free[i-1].size == address) {
man->free[i-1].size += size;
// 後ろもあるとき
if(i < man->frees) {
// 後ろの領域もまとめられるとき
if(address += size == man->free[i].address) {
man->free[i-1].size += man->free[i].size;
// man->free[i]がなくなったので削除
man->frees--;
for(; i < man->frees; i++)
man->free[i] = man->free[i+1];
}
}
return 0;
}
}
// 前にはまとめられなかったとき
if(i < man->frees) {
// 後ろがあるとき
if(address += size == man->free[i].address) {
man->free[i].address = address;
man->free[i].size += size;
return 0;
}
}
// 前とも後ろともまとめられないとき
if(man->frees < MEMMAN_FREES) {
// free[j]よりも後ろを、後ろへずらして、隙間を作る
for(j = man->frees; j > i; j--)
man->free[j] = man->free[j-1];
man->frees++;
if(man->maxfrees < man->frees) {
man->maxfrees = man->frees;
}
man->free[i].address = address;
man->free[i].size = size;
return 0;
}
// 記憶領域を越えているとき
man->losts++;
man->lostsize += size;
return -1; // 失敗
}
此方の関数は、自作本中ではコメントだけでテキストによる説明がなく、少々イメージし辛い
int mem_free(MEMORY_MANAGE *man, dword address, dword size) {
for(i = 0; i < man->frees; i++) {
// 解放するメモリをどこに入れるか決める(77~80)
}
// 前があるとき(82~101)
if(i > 0) {
// 前後とうまくまとめる
}
// 前にはないとき(103~111)
if(i < man->frees) {
// 後ろとうまくまとめる
}
// 前とも後ろともまとめられないとき(113~125)
if(man->frees < MEMMAN_FREES) {
// 新しい情報を追加する
}
// それでも駄目だったら
// 大人しく諦めて捨てる
}
だいたいこんな感じです。
COMMENT