内存映射文件通过将文件直接映射到进程地址空间,避免传统I/O的数据拷贝开销,支持高效的大文件访问与共享。Windows使用CreateFileMapping和MapViewOfFile,Linux使用mmap实现。其优势包括节省物理内存、避免堆碎片、支持超大文件和进程间共享,适用于大日志检索、数据库加载、多媒体处理等场景。需注意资源释放、数据同步、虚拟内存耗尽及多线程同步问题。

在C++中处理大内存分配时,传统的
malloc
new
内存映射文件是一种将磁盘上的文件内容直接映射到进程虚拟内存的技术。操作系统负责在需要时将文件的某些页加载到物理内存,并在内存压力大时将其换出。对程序来说,这部分数据就像普通的内存一样,可以用指针直接读写。
这种方式避免了传统I/O中
read
write
内存映射文件的使用在不同操作系统上略有差异,下面分别介绍Windows和Linux下的实现方式。
立即学习“C++免费学习笔记(深入)”;
Windows平台
Windows提供了一组API来支持内存映射文件:
CreateFile
CreateFileMapping
MapViewOfFile
示例代码:
#include <windows.h>
#include <iostream>
<p>int main() {
HANDLE hFile = CreateFile(L"largefile.dat", 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;">HANDLE hMapping = CreateFileMapping(hFile, nullptr, PAGE_READWRITE, 0, 1024 * 1024 * 1024, nullptr); // 映射1GB
if (!hMapping) {
std::cerr << "无法创建映射\n";
CloseHandle(hFile);
return 1;
}
char* pData = static_cast<char*>(MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));
if (!pData) {
std::cerr << "无法映射视图\n";
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
// 直接访问内存
pData[0] = 'H';
pData[1] = 'i';
// 清理
UnmapViewOfFile(pData);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;}
Linux/Unix平台
Linux使用
mmap
open
mmap
munmap
示例代码:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
<p>int main() {
int fd = open("largefile.dat", O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror("open");
return 1;
}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">const size_t fileSize = 1UL << 30; // 1GB
// 扩展文件大小
lseek(fd, fileSize - 1, SEEK_SET);
write(fd, "", 1);
char* pData = static_cast<char*>(mmap(nullptr, fileSize, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0));
if (pData == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
// 使用映射内存
pData[0] = 'H';
pData[1] = 'i';
// 同步到磁盘
msync(pData, fileSize, MS_SYNC);
// 解除映射
munmap(pData, fileSize);
close(fd);
return 0;}
相比直接使用
new
malloc
常见应用场景包括:
使用内存映射文件时需注意以下几点:
msync
FlushViewOfFile
基本上就这些。内存映射文件是处理大内存需求时的强大工具,合理使用可以显著提升程序性能和稳定性。
以上就是C++大内存如何分配 内存映射文件技术的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号