Как использовать mmap для указания на тип STL? - PullRequest
1 голос
/ 16 апреля 2010

У меня есть тип карты mmap для указателя на символ

char * ptr;

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

Это был мой предыдущий код. Но теперь я хочу использовать карту вместо char *, так как требования изменились.

Теперь моя карта объявлена ​​как map i_s_map;

Как мне изменить вызов mmap, чтобы он указывал на карту?

Ответы [ 2 ]

6 голосов
/ 16 апреля 2010

Вы не хотите хранить контейнеры STL в общей памяти, по крайней мере, не делиться ими. Причина заключается в том, что они в значительной степени зависят от выделения кучи, поэтому готовый std::map будет хранить указатели из виртуального адресного пространства другого процесса.

Взгляните на boost::interprocess, чтобы узнать, как справиться с этой ситуацией в C ++.

2 голосов
/ 18 апреля 2010

Если вы хотите создать объект карты в памяти, возвращаемой mmap, используйте размещение new.

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

Это создаст сам объект карты в памяти. Чтобы получить элементы внутри карты в память, вам нужно будет создать собственный распределитель для хранения данных в памяти. Вы можете использовать библиотеку boost interprocess для некоторых распределителей, которые работают внутри разделяемой памяти.

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

...