Skip to content

melpon/reloc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

reloc

reloc は、リロケータブルなメモリを生成し、操作するためのライブラリです。 以下のように使用します。

void* mem = malloc(100 * 1024); // 100KB のプール用のメモリを用意する
reloc_pool pool(mem); // メモリプール生成
reloc_ptr ptr = pool.allocate(100); // 100バイトのメモリを確保
pinned_ptr pin = ptr.pin(); // ピンを打ってメモリを動かないようにする
pinned_ptr pin2 = pin;
void* raw_ptr = pin2.get(); // 生のポインタを取得
pin2.reset(); // この時点ではピンは外れない
pin.reset(); // ここでピンが外れる
// ピンが外れたため、これ以降 raw_ptr へのアクセスは保証されない
pool.deallocate(ptr); // メモリの解法。ピンしてる状態で解放してはならない。
free(mem); // 後片付け

reloc_pool はメモリプールを表し、reloc_pool::allocate によってメモリを確保します。 その際に返されるのはメモリではなく、reloc_ptr 型のハンドルです。 このとき、確保したメモリ領域はリロケーションによって任意の場所へ移動します。 このままメモリへアクセスしていると、アクセス中にメモリが動いてしまったりすることも考えられるので、reloc_ptr::pin 関数でピンを打ち、メモリを動かないようにします。 このようにしてメモリを動かないようにすれば、pinned_ptr::get によってポインタを取得し、メモリへ直接アクセスしても安全です。 ただし、pinned_ptr が全て解放されれば再度動くようになるので、pinned_ptr の寿命を超えてポインタを渡すようなことはしないで下さい。

問題点

  • 毎回フリーリストの先頭から検索して確保しているので、確保に時間が掛かり、メモリの使用が先頭に偏ってしまうようになっている。

zlibpp

zlibpp は、zlib の単純な C++ ラッパーです。

z_reloc

z_reloc は、reloc_pool のメモリを使用して zlib の圧縮・展開を行う機能を提供しています。

About

Relocatable Pointer

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages