mmap() を使うカスタムアロケーターといっても、まあ既に部分的にそれっぽいものは作ってます。
malloc() 関数は一定サイズ以上の割り当てリクエストには mmap() を使って割り当てるので、単にメモリーを割り当てるだけなら mmap() を使うためのアロケーターは不要です。
全米が咽(むせ)び泣き感動した malloc() と mmap() のコラボ… の必要はなかた… (´・ω・`)
まあ mmap() をあえて使いたい時は、大容量のデータアクセスをしたい時なんかじゃないかと思います。
例えばメモリーに入り切らないような大きなデータをファイルシステムから読み込みたい場合や、余計なオーバーヘッドなくファイルシステムに即座に反映させたいなら mmap() じゃないと実現できないですからね。
それでも mmap() とかいう謎システムコールを使うのは心理的抵抗はあると思います。
でも C++ アンチから散々 C++ の罵詈雑言を浴びせられて、これまで生き延び長らえた C++er ならば「石の上にも三年」の精神でローレベルなカオスにも踏み応えられるでしょう(プチ耐久性)。
mmap() アロケーターには 2 種類あると筆者は思います。
このうち前者はまあ楽っちゃ楽です。
とりあえず mmap() でマップしたメモリー領域のポインターを返して、不要になったら munmap() までをアロケーターが行います。
割り当てたメモリー領域はもちろん construct() や destroy() を使ってオブジェクトを直接利用しても良いですが、ページサイズの倍数ということは 4096 バイトぐらいになるわけで、それだと勿体ないです。
なのでユーザーアプリケーション側で使い方を考えることになります。
もしくはアロケーターをより使いやすく実装することもできますが、具体的な使用ニーズがないと検討ハズレなものになるでしょう。
後者の実装はスタックアロケーターやヒープアロケーターと同様に最初に可能な限り大きなサイズの領域を割り当てて、後はユーザーには mmap() でファイルマッピングした領域を返します。
では大した説明はできませんが、実装を検討してみましょう。
Copyright 2018-2019, by Masaki Komatsu