いやいやManaged Heap Memoryの方が
Managed Heap MemoryがBoost.interprocess Document P.90に書いてあります。これはstatic buffer領域を必要とせず、予めヒープ上のメモリを確保して利用する形だそうです。使い方はManaged Heap Memoryと同じで構築方法が異なります。
例えば、自前でヒープ上から確保したのをManaged External Bufferで行うと、
static const std::size_t MemorySize = 65536; std::unique_ptr<char[]> heap_memory( new char[MemorySize] ); // MemorySize分のヒープを用いて bip::managed_external_buffer external_buffer(bip::create_only,heap_memory.get(),MemorySize);
とちょっと面倒ですが、Managed Heap Memoryでは、
#include <boost/interprocess/managed_heap_memory.hpp> bip::managed_heap_memory heap_memory(65536);
と1行で済みます。メモリの確保/削除もこのクラスが行ってくれるので我々は何バイト分欲しいかを言うだけです。簡単ですね。具体的な使い方は作成以外はManaged External Bufferと変わらないので大丈夫だと思います。
前回言ったメモリの制限とかは(パソコンなら)こちらの方がよさそうです。前回のはメモリサイズが厳しい所の方が向いている、と言っていいはずです。私としては特殊な状況/場合を除き、Managed Heap Memoryの方をオススメしておきます。
growに注意
Managed Heap Memoryは必要に応じてサイズを拡張(grow)できます。しかし、この操作はgrowしたいサイズ分を加えたサイズをもう一度ヒープから確保しなおして前のヒープのデータをコピーします。つまり、
bip::managed_heap_memory heap_memory(65536); heap_memory.grow(1024); // 1024バイト拡張
という操作は、
static const std::size_t MemorySize = 65536; std::unique_ptr<char[]> old_buffer( new char[MemorySize] ); std::unique_ptr<char[]> new_buffer( new char[MemorySize + 1024] ); std::memcpy(new_buffer.get(),old_buffer.get(),MemorySize);
という操作と等価です。ヒープそのもののアドレスが変わるので、例えばポインタを直接持っているような場合は注意をしないと領域外アクセスになるので注意。もし、ポインタが必要ならばoffset_ptrを用いて相対アドレスを持っておくなどする必要がありそうです。非常に面倒なので、なるべくgrowする必要のないように設計した方が良いです。