1

char ポインターに型キャストされた mmap があります

char *ptr;

ptr = (char *)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

これは私の以前のコードでした。しかし、要件が変更されたため、char * の代わりにマップを使用したいと考えています。

今、私のマップは map < int, string > i_s_map; として宣言されています。

マップを指すように mmap 呼び出しを変更するにはどうすればよいですか?

4

2 に答える 2

6

STLコンテナを共有メモリに保存したくない場合は、少なくとも共有しないでください。その理由は、それらがヒープ割り当てに大きく依存しているため、すぐに使用std::mapできる状態で、別のプロセスの仮想アドレス空間からのポインターを保持するためです。

boost::interprocessC++でこの状況に対処する方法を見てください。

于 2010-04-16T02:08:27.010 に答える
3

mmap によって返されたメモリ内にマップ オブジェクトを作成する場合は、placement new を使用します。

map<int,string> *i_s_map = new(ptr) map<int,string>();

これにより、メモリ内にマップ オブジェクト自体が作成されます。マップ内の要素をメモリに取得するには、データをメモリに保持するカスタム アロケータを作成する必要があります。共有メモリ内で動作する一部のアロケータには、ブースト プロセス間ライブラリを使用できます。

http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.allocator_introduction

于 2010-04-18T03:56:46.377 に答える