C++/Win32 在虚拟内存中创建文件

5

如何在虚拟内存中创建文件,并可以使用常规文件函数(如CreateFile,WriteFile等)?

我正在尝试实现一个缓冲文件写入类,但问题是管理需要动态恒定重新分配的缓冲区。


“在虚拟内存中创建一个文件” 是什么意思?用户空间进程(应用程序)可用的所有内存都是虚拟的。 - LiMar
也许他的意思是模拟操作系统功能,虚拟内存!!属于NUMA类型。 - perilbrain
我想在由Windows分配的进程内存中创建文件,而不是在物理磁盘中创建。 - user1581390
3个回答

4
你可以使用管道。操作系统也将它们视为“文件”,因此你可以使用WriteFile和ReadFile进行读写操作:
HANDLE               hReadPipe;
HANDLE               hWritePipe;
CreatePipe(&hReadPipe, &hWritePipe , 0, 0);
WriteFile(hWritePipe, "hello", 5, 0, 0);

int sz = GetFileSize(hReadPipe, 0);
assert(sz == 5);
char out[5];
ReadFile(hReadPipe, out, 5, 0,0);

如果需要,您甚至可以使用类似于_open_osfhandle的方法将它们转换为C FILE*句柄。


2

对于C ++,只需使用std :: [io] stringstream

对于Windows API,您可以调用{{link1:CreateFile}}并使用{{link2:FILE_ATTRIBUTE_TEMPORARY}}标志,它将尝试(但不保证)将内容保存在RAM中而不是磁盘上。


1

我认为你想要整个文件在虚拟内存中?但是这对我来说有点困难,因此我有另一种解决方法。您可以使用VirtualAllocExNuma将文件加载到内存中并进行操作。由于虚拟内存是仅由操作系统保留的内存部分,但在物理上它分散在不同的非统一内存设备(除了RAM)中。
它不是一个文件系统,您无法保存文件,并且如何管理它也很难被跟踪(至少对我来说是这样!)。

VirtualAllocExNuma

在指定进程的虚拟地址空间内保留或提交一块内存区域,并指定物理内存的NUMA节点。


好的,那么一旦我在虚拟内存中保留了这个空间,如何重定向WriteFile函数以在其中写入? - user1581390
1
你不必使用WriteFile来写入,这只是一个内存块,你知道使用指针或memcpy在空闲空间中写入有多容易。将任何想要保存的内容保存在其中,然后使用WriteFile将该内存刷新到文件中。 - perilbrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接