内存映射文件通过将文件直接映射到虚拟地址空间,使程序能像访问内存一样读写大文件,避免频繁I/O调用。它减少I/O开销、支持超大文件处理、实现进程间共享数据,并采用按需加载机制节省内存。Windows使用CreateFileMapping和MapViewOfFile,POSIX系统使用mmap和munmap进行映射。适用场景包括大文件随机访问、进程通信和内存受限环境下的数据处理,但需注意映射失败、同步刷新和并发控制等问题。合理使用可显著提升C++程序性能与稳定性。

在C++程序中处理大内存分配时,传统的堆内存分配(如
new
malloc
内存映射文件利用操作系统的虚拟内存机制,将一个文件或部分文件映射到进程的地址空间。操作系统负责在后台按需将文件的页加载到物理内存,并在必要时换出。对映射区域的访问由操作系统自动处理,程序员只需像操作普通指针一样读写数据。
这种方式的优点包括:
read()
write()
不同操作系统提供不同的API。Windows使用
CreateFileMapping
MapViewOfFile
mmap
munmap
立即学习“C++免费学习笔记(深入)”;
Windows平台示例:
假设要映射一个大二进制文件进行读写:
#include <windows.h>
#include <iostream>
<p>int main() {
HANDLE hFile = CreateFile(L"large_data.bin", GENERIC_READ | GENERIC_WRITE,
0, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "无法打开文件\n";
return -1;
}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">LARGE_INTEGER fileSize;
GetFileSizeEx(hFile, &fileSize);
HANDLE hMapping = CreateFileMapping(hFile, nullptr, PAGE_READWRITE, 0, 0, nullptr);
if (!hMapping) {
CloseHandle(hFile);
return -1;
}
void* pMapped = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (!pMapped) {
CloseHandle(hMapping);
CloseHandle(hFile);
return -1;
}
// 现在可以通过 pMapped 访问文件内容
char* data = static_cast<char*>(pMapped);
data[0] = 'H'; // 修改文件第一个字节
data[1] = 'i';
// 刷回磁盘(可选)
FlushViewOfFile(pMapped, 0);
UnmapViewOfFile(pMapped);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;}
Linux/POSIX平台示例:
使用
mmap
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
<p>int main() {
int fd = open("large_data.bin", O_RDWR | O_CREAT, 0644);
if (fd == -1) {
perror("open");
return -1;
}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">const size_t file_size = 4096; // 示例大小
lseek(fd, file_size - 1, SEEK_SET);
write(fd, "", 1); // 扩展文件
void* addr = mmap(nullptr, file_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return -1;
}
char* data = static_cast<char*>(addr);
data[0] = 'H';
data[1] = 'i';
// 同步到磁盘
msync(addr, file_size, MS_SYNC);
munmap(addr, file_size);
close(fd);
return 0;}
内存映射文件特别适合以下情况:
但也要注意:
FlushViewOfFile
msync
基本上就这些。内存映射文件是C++中处理大内存需求的有力工具,合理使用可显著提升程序性能和稳定性。不复杂但容易忽略细节,比如文件大小预分配和错误检查。
以上就是C++大内存分配 内存映射文件技术应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号