如何将内存映射文件封装成std::vector?

How to encapsulate a memory-mapped file into a std::vector?

在 C++ 中,在 Linux 上,在我用 open() 打开一个文件然后用 mmap() 对其进行内存映射后,我得到一个 void* 我可以类型转换为例如char* 并根据需要阅读。

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

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

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

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

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

我想要这样做的原因是为了避免 class 中的 raw/POD 指针解释该内存映射区域中的二进制数据。

Is there perhaps some other standard-library class that would serve my purpose?

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