2010-04-16 4 views
1

У меня есть mmap typecast to char pointerКак использовать mmap для указания типа STL?

char * ptr;

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

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

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

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

+0

ММАП определяется в . Что такое i_s_map? Он помечен STL. Я не вижу никаких ссылок на это. Что вы хотите сделать здесь? –

+0

Вы подразумеваете, что 'std :: map' имеет какое-то отношение к' mmap'? Это не имеет смысла. – Potatoswatter

+0

Я знаю, что mmap возвращает указатель void *. Я просто хочу знать, как я могу придать этому указателю void * указать один из типов STL .. в этом случае это карта. Это может быть список, набор или мультимап. Я просто хочу знать, возможно ли это. – srikanta

ответ

6

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

Посмотрите на boost::interprocess, чтобы найти способ справиться с этой ситуацией на C++.

2

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

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