我在某处读到,当常规的 c/c++ 应用程序需要访问文件时,通常会将文件的内容放在进程内存中并使用内存操作读取或修改它。这称为内存映射或仅映射文件。
这是否意味着我需要将数据复制到(片上)缓冲区中,并根据需要修改内容,然后将其写回文件中?是否有特定的功能来实现这一点?
有人可以指向我详细描述此内容的链接吗?问题是单词记忆映射太宽泛,我找不到确切的信息。
我正在使用 Windows-7,Visual Studio 2010
不需要从文件中复制数据。内存映射文件意味着,您用来“打开”文件的函数会为您提供一个包含该文件内容的缓冲区。这个缓冲区不是复制文件内容的 RAM 内存,而是一个虚拟内存,其访问直接映射到磁盘上的文件。我不知道它在 Windows 中是如何工作的,但这就是 mmap() 调用在 linux 中所做的。当您修改该缓冲区并关闭文件时,磁盘上的内容会自动更新。
不,不是那个意思。你所描述的将是不好的做法。非常糟糕的做法。相反,内存映射意味着操作系统创建一个特殊的指针,它知道它对应于一个文件,然后每当该指针作为数组访问时,操作系统,而不是写入内存(或者可能实际上也写入内存),它就地修改磁盘上文件的内容。如果您的系统符合 POSIX,您可以使用该mmap()
函数将文件映射到内存区域/指针:
int fd = open("/path/to/file.ext", O_RDWR);
struct stat st;
fstat(fd, &st);
uint8_t *byte_ptr = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// read a byte from the file
uint8_t byte = byte_ptr[12];
// increment it
byte++;
// and write it back
byte_ptr[12] = byte;
close(fd);