当前位置: 首页 > 知识库问答 >
问题:

如何将内存映射文件封装到std::向量中?

符献
2023-03-14

在C语言中,在Linux上,当我用open()打开一个文件,然后用mmap()对其进行内存映射后,我会得到一个void*,我可以将其键入char*并根据需要读取。

但是,假设我想使用std::vector来访问这些数据。我怎样才能做到呢?

起初我以为我可以为我的std::vector定制一个分配器。但我看到了两个问题:

  1. 它的allocate()方法将只接收一个size参数。这是不够的,因为它还需要知道已经映射的地址,而不是分配一个新地址(就像分配器通常做的那样)
  2. 它的deallocate()方法——要正确地做到这一点——需要同时取消缓冲区的映射(简单,一旦解决了上面的#1),以及close()文件描述符(很难,因为它无法知道该值)

我考虑过可能将这些元数据(现有映射地址和文件描述符)存储在一个已知的位置,供我的自定义分配器引用,但如果不让TLS复杂化,这将是线程安全的。

以上是可能的吗?还是不明智的(如果是,请解释)?也许还有其他一些标准库类可以满足我的目的?

我之所以想这样做,是为了避免类中的raw/POD指针解释内存映射区域中的二进制数据。

共有1个答案

柴瀚昂
2023-03-14

也许还有其他标准的图书馆课程可以满足我的需求吗?

是:std::span是一个包装器,提供类似容器的访问,而不需要所有权。

 类似资料:
  • 读 # mmap_read.py import mmap with open('lorem.txt', 'r') as f: with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m: print('First 10 bytes via read :', m.read(10

  • 问题内容: 最近,我碰到了这篇文章,这篇文章很好地介绍了内存映射文件以及如何在两个进程之间共享它。这是读取文件的过程的代码: 但是,我对这种方法有几点评论/问题: 如果我们仅对空文件执行读取器,即运行 这将分配8000个字节,现在将扩展文件。返回的缓冲区的限制为8000,位置为0,因此,读取器可以继续读取空数据。发生这种情况后,阅读器将停止,如。 现在应该是作家了(代码被省去了,因为它很简单,可以

  • 问题内容: 我一直在尝试编写一些非常快速的Java代码,这些代码必须执行很多I / O。我正在使用返回ByteBuffer的内存映射文件: 我遇到的问题是ByteBuffer .array()方法(应返回一个byte []数组)不适用于只读文件。我想编写我的代码,以便它可以与构造在内存中的内存缓冲区和从磁盘读取的缓冲区一起使用。但是我不想将所有缓冲区都包装为ByteBuffer.wrap()函数,

  • 我试图将元组向量转换为向量[人],但上面的代码会导致强制转换异常,即使存在隐式的元组-人转换函数? 线程“main”java中出现异常。lang.ClassCastException:scala。Tuple2无法转换为示例。例如,测试$人。测试$$anonfun$2$$anonfun$应用$1。在scala应用(测试scala:19)。收集迭代器$类。scala上的foreach(迭代器。scal

  • 编者按:此代码示例来自Rust 1.0之前的版本,它使用的代码在Rust 1.0中不存在。更新了一些答案,以回答更新版本的Rust的核心问题。 我正在尝试使用创建内存映射文件。目前的做法如下: 这个程序失败了 调用或对数据执行任何其他操作时。 我无法从

  • 我有一个整数向量: 考虑到将始终为偶数。 我只是想把相邻的元素转换成一对,像这样: i、 两个相邻的元件连接成一对。 我可以使用什么STL算法轻松实现这一点?有没有可能通过一些标准算法来实现这一点? 当然,我可以很容易地编写一个旧的索引for循环来实现这一点。但我想知道,使用基于范围的for循环或任何其他STL算法(如等)最简单的解决方案是什么样的。