1

我有一个到 char 指针的 mmap 类型转换

字符 *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::interprocess在 C++ 中处理这种情况的方法。

于 2010-04-16T02:08:27.010 回答
3

如果要在 mmap 返回的内存中创建地图对象,请使用placement new。

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

这将在内存中创建地图对象本身。为了将地图中的元素放入内存,您需要创建一个自定义分配器来将数据保存在内存中。您可以将 boost 进程间库用于在共享内存中工作的一些分配器。

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 回答