我有一个到 char 指针的 mmap 类型转换
字符 *ptr;
ptr = (char *)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
这是我之前的代码。但是现在我想使用地图而不是 char * 因为要求发生了变化。
现在,我的地图被声明为 map < int, string > i_s_map;
如何更改我的 mmap 调用以指向地图?
您不想将 STL 容器存储在共享内存中,至少不要共享它们。原因是它们严重依赖堆分配,因此开箱即用的std::map
将保存来自不同进程的虚拟地址空间的指针。
看看boost::interprocess
在 C++ 中处理这种情况的方法。
如果要在 mmap 返回的内存中创建地图对象,请使用placement new。
map<int,string> *i_s_map = new(ptr) map<int,string>();
这将在内存中创建地图对象本身。为了将地图中的元素放入内存,您需要创建一个自定义分配器来将数据保存在内存中。您可以将 boost 进程间库用于在共享内存中工作的一些分配器。