如何将内存映射文件封装成std::vector?
How to encapsulate a memory-mapped file into a std::vector?
在 C++ 中,在 Linux 上,在我用 open()
打开一个文件然后用 mmap()
对其进行内存映射后,我得到一个 void*
我可以类型转换为例如char* 并根据需要阅读。
但是,假设我想使用 std::vector 访问该数据。我怎样才能做到这一点?
起初我以为我可以为我的 std::vector 创建一个自定义分配器。但我看到了两个问题:
- 它的
allocate()
方法只会接收一个大小参数。这还不够,因为它还需要知道已经映射的地址,而不是分配一个新地址(分配器通常这样做。)
- 它的
deallocate()
方法——要正确地做到这一点——需要取消映射缓冲区(简单,一旦上面的#1 被解决,)和 close()
文件描述符(困难,因为它无法知道该值。)
我考虑过可能将此元数据(现有的映射地址和文件描述符)存储在我的自定义分配器引用的已知位置,但如果不使用 TLS 使事情复杂化,那将不是线程安全的。
以上有可能吗?还是不明智(如果是,请解释)?是否有其他标准库 class 可以满足我的目的?
我想要这样做的原因是为了避免 class 中的 raw/POD 指针解释该内存映射区域中的二进制数据。
Is there perhaps some other standard-library class that would serve my purpose?
是:std::span
是一个包装器,提供类似容器的无所有权访问。
在 C++ 中,在 Linux 上,在我用 open()
打开一个文件然后用 mmap()
对其进行内存映射后,我得到一个 void*
我可以类型转换为例如char* 并根据需要阅读。
但是,假设我想使用 std::vector 访问该数据。我怎样才能做到这一点?
起初我以为我可以为我的 std::vector 创建一个自定义分配器。但我看到了两个问题:
- 它的
allocate()
方法只会接收一个大小参数。这还不够,因为它还需要知道已经映射的地址,而不是分配一个新地址(分配器通常这样做。) - 它的
deallocate()
方法——要正确地做到这一点——需要取消映射缓冲区(简单,一旦上面的#1 被解决,)和close()
文件描述符(困难,因为它无法知道该值。)
我考虑过可能将此元数据(现有的映射地址和文件描述符)存储在我的自定义分配器引用的已知位置,但如果不使用 TLS 使事情复杂化,那将不是线程安全的。
以上有可能吗?还是不明智(如果是,请解释)?是否有其他标准库 class 可以满足我的目的?
我想要这样做的原因是为了避免 class 中的 raw/POD 指针解释该内存映射区域中的二进制数据。
Is there perhaps some other standard-library class that would serve my purpose?
是:std::span
是一个包装器,提供类似容器的无所有权访问。