【问题标题】:How to use mmap to point to STL type?如何使用 mmap 指向 STL 类型?
【发布时间】:2023-03-25 23:00:01
【问题描述】:

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

char *ptr;

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

这是我之前的代码。但是现在我想使用地图而不是 char *,因为需求发生了变化。

现在,我的地图被声明为 地图 i_s_map;

如何更改我的 mmap 调用以指向地图?

【问题讨论】:

  • mmap 在 中定义。 i_s_map 是什么?它被标记为 STL。我没有看到任何关于它的参考。你想在这里做什么?
  • 您是在暗示std::mapmmap 有关吗?这没有意义。
  • 我知道 mmap 返回一个 void * 指针。我只想知道如何将这个 void * 指针类型转换为指向其中一种 STL 类型。在这种情况下,它是一个映射。它可以是列表、集合或多图。我只是想知道这是否可能。
  • 尝试从一个转换到另一个意味着它们之间存在某种关系。它们完全不相关。 (不过,您可以在 mmap 返回的内存中构造任何内容。)

标签: c++ stl mmap


【解决方案1】:

您不想将 STL 容器存储在共享内存中,至少不要共享它们。原因是它们严重依赖堆分配,因此开箱即用的std::map 将保存来自不同进程的虚拟地址空间的指针。

查看boost::interprocess 以了解在 C++ 中处理这种情况的方法。

【讨论】:

    【解决方案2】:

    如果要在 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

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2018-02-26
      • 2019-01-12
      • 2020-08-12
      相关资源
      最近更新 更多