内存映射文件是将磁盘文件映射到进程地址空间,使程序像访问内存一样操作文件内容。1. 它通过操作系统自动管理缓存和分页,提高大文件处理效率;2. linux 使用 mmap 和 munmap 实现,需指定映射地址、大小、权限、标志等参数;3. windows 通过 createfilemapping 和 mapviewoffile 实现类似功能;4. 跨平台封装可通过类实现不同系统调用各自 api,统一接口为 map 和 unmap;5. 使用时需注意文件大小、读写模式、错误判断及资源释放。
在C++中使用内存映射文件(Memory-Mapped File)是一种高效的文件读写方式,尤其适合处理大文件。它通过将文件映射到进程的地址空间,使得程序可以直接像访问内存一样访问文件内容。mmap 是 Linux 系统下常用的内存映射函数,但在 Windows 上没有直接对应的 mmap,需要做跨平台适配。
内存映射文件的核心思想是:把磁盘上的文件映射成一段内存地址。这样读写文件就像操作数组一样方便,而且操作系统会自动管理缓存和分页,效率很高。
比如你想读取一个几十GB的日志文件,用传统 fread 或 ifstream 可能会很慢,但用内存映射就可以按需加载部分数据,节省时间和资源。
立即学习“C++免费学习笔记(深入)”;
在 Linux 下,使用的是
void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
示例代码片段:
int fd = open("example.txt", O_RDONLY); char* data = (char*) mmap(nullptr, file_size, PROT_READ, MAP_SHARED, fd, 0); // 使用 data 操作文件内容 munmap(data, file_size); close(fd);
Windows 并不支持 mmap,但提供了类似的机制:CreateFileMapping + MapViewOfFile
步骤如下:
示例伪代码结构:
HANDLE hFile = CreateFile(...); HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); char* data = (char*) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); // 使用 data UnmapViewOfFile(data); CloseHandle(hMap); CloseHandle(hFile);
为了统一接口,可以做一个简单的封装,在不同系统下调用各自 API:
class MemoryMappedFile { public: void* map(const char* filename, size_t& out_size); void unmap(); private: #ifdef _WIN32 HANDLE hMap; #else int fd; #endif void* data; };
在 .cpp 文件中根据平台分别实现:
封装后用户只需要知道 map() 和 unmap() 即可,不用关心底层细节。
基本上就这些。虽然不同系统 API 不同,但逻辑差不多,只要做好封装,就能写出跨平台兼容的内存映射文件操作代码。
以上就是C++中内存映射文件怎么用?mmap跨平台实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号