大文件的内存映射的问题

keyayi 2008-12-10 11:59:35
当把大文件映射到内存后,那么可以用指针偏移来定向文件中的数据,我想问的是大文件映射过来后,被分配的内存是连续的吗?
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
星羽 2008-12-10
  • 打赏
  • 举报
回复
a sample


#include "windows.h"
#include "vector"
#include "iostream"
using namespace std;

int _tmain(int argc, TCHAR* argv[])
{
HANDLE hFile = CreateFile(TEXT("test.dat"),
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);

if (hFile == INVALID_HANDLE_VALUE)
return 1;

HANDLE hFmap = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL);

CloseHandle(hFile);

if (hFmap == INVALID_HANDLE_VALUE)
return 1;

void* pByte = MapViewOfFile(hFmap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

// read
cout<<(char*)pByte<<endl;

// write
//memcpy(pByte, "hello world :)", sizeof("hello world :)"));
//UnmapViewOfFile(pByte);

CloseHandle(hFmap);

return 0;
}


星羽 2008-12-10
  • 打赏
  • 举报
回复
你 MapViewOfFile 之后就可以操作数据指针了
星羽 2008-12-10
  • 打赏
  • 举报
回复
map后就是连续的
anran2008 2008-12-10
  • 打赏
  • 举报
回复
被分配的内存不是用来放文件内容的,
把数据文件的一部分映射到虚拟地址空间(映射到的区域是在0x80000000-0xBFFFFFFF内),但不提交RAM,存取这段内存的指令同样会产生页面异常。操作系统捕获到这个异常后,分配一页RAM,并把它映射到当前进程发生异常的地址处,然后系统把文件中相应的数据读到这个页面中,继续执行刚才产生异常的指令。因此应用程序自己不需要调用文件I/O函数,
这和你认为的new一块内存然后放内容是不一样的
keyayi 2008-12-10
  • 打赏
  • 举报
回复
分配的内存连续不?

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧