内存映射文件通过将文件直接映射到进程地址空间,实现高效读写。Windows使用CreateFile、CreateFileMapping、MapViewOfFile等API,Linux则用open、mmap、munmap;跨平台可借助Boost.Interprocess封装,注意权限与资源管理。

在C++中使用内存映射文件可以高效地读写大文件,避免频繁的I/O操作。内存映射的核心思想是将文件直接映射到进程的虚拟地址空间,让程序像访问内存一样读写文件内容。
Windows平台下的内存映射文件使用方法
在Windows系统中,使用Win32 API来实现内存映射文件。主要涉及以下几个函数:
- CreateFile:打开或创建一个文件句柄
- CreateFileMapping:创建一个文件映射对象
- MapViewOfFile:将文件映射对象映射到当前进程地址空间
- UnmapViewOfFile 和 CloseHandle:释放资源
示例代码(Windows):
#include#include int main() { HANDLE hFile = CreateFile(L"test.txt", GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { std::cerr << "无法打开文件" << std::endl; return 1; }
HANDLE hMapping = CreateFileMapping(hFile, nullptr, PAGE_READWRITE, 0, 4096, nullptr); if (!hMapping) { std::cerr << "无法创建文件映射" << std::endl; CloseHandle(hFile); return 1; } char* pData = static_castzuojiankuohaophpcnchar*youjiankuohaophpcn(MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if (!pData) { std::cerr << "无法映射视图" << std::endl; CloseHandle(hMapping); CloseHandle(hFile); return 1; } // 写入数据 strcpy_s(pData, 256, "Hello Memory Mapped File!"); // 读取数据 std::cout zuojiankuohaophpcnzuojiankuohaophpcn "读取内容: " zuojiankuohaophpcnzuojiankuohaophpcn pData zuojiankuohaophpcnzuojiankuohaophpcn std::endl; UnmapViewOfFile(pData); CloseHandle(hMapping); CloseHandle(hFile); return 0;}
立即学习“C++免费学习笔记(深入)”;
Linux/Unix平台下的内存映射文件使用方法
在Linux系统中,使用POSIX提供的mmap和munmap函数进行内存映射。
- open:打开文件
- mmap:将文件映射到内存
- munmap 和 close:释放映射和关闭文件描述符
示例代码(Linux):
#include#include #include #include #include #include int main() { int fd = open("test.txt", O_RDWR | O_CREAT, 0666); if (fd == -1) { perror("打开文件失败"); return 1; }
// 设置文件大小 lseek(fd, 4096, SEEK_SET); write(fd, "", 1); // 映射文件 char* pData = static_castzuojiankuohaophpcnchar*youjiankuohaophpcn(mmap(nullptr, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); if (pData == MAP_FAILED) { perror("mmap失败"); close(fd); return 1; } // 写入数据 strcpy(pData, "Hello from mmap!"); // 读取数据 std::cout zuojiankuohaophpcnzuojiankuohaophpcn "读取内容: " zuojiankuohaophpcnzuojiankuohaophpcn pData zuojiankuohaophpcnzuojiankuohaophpcn std::endl; // 释放映射 munmap(pData, 4096); close(fd); return 0;}
立即学习“C++免费学习笔记(深入)”;
跨平台封装建议
如果希望代码能在多个平台运行,可以使用宏定义区分平台,或者借助Boost.Interprocess等库简化操作。
Boost示例(需安装Boost库):
#include#include #include using namespace boost::interprocess;
int main() { managed_mapped_file file(open_or_create, "test.bin", 4096); char* pStr = file.construct
32(); strcpy(pStr, "Boost mmap example"); std::cout zuojiankuohaophpcnzuojiankuohaophpcn pStr zuojiankuohaophpcnzuojiankuohaophpcn std::endl; file.destroyzuojiankuohaophpcncharyoujiankuohaophpcn[32]("Hello"); return 0;}
立即学习“C++免费学习笔记(深入)”;
基本上就这些。关键在于理解映射机制,注意权限设置、资源释放和跨平台差异。实际使用时要加上错误处理,确保程序健壮性。











