c++内存映射初学

来源:互联网 发布:端口映射软件使用教程 编辑:程序博客网 时间:2024/05/17 03:51

内存映射文件是利用虚拟内存把文件映射到进程的地址空间去,在此之后对进程操作文件,就像操作进程空间里的地址一样了,这种方法能够很好的应用在需要频繁处理一个文件或者是大文件的场合,这种方式处理IO效率比普通IO效率要高。复制自http://www.cnblogs.com/yukaizhao/archive/2011/08/01/system-io-memorymappedfile.html

还看了http://blog.csdn.net/mengxingyuanlove/article/details/50986092的原理

还看了http://blog.csdn.net/haiross/article/details/46875211的代码

自己理解就是把内存中的一段空间跟实际存储的空间之间建立一种直接的关系,当在程序中读写指针的值时,就是直接对磁盘空间的数据进行改变,然后在这个过程中减少了一些数据拷贝过程,相对效率会更高一下然后就这些,自己理解的比较浅,等以后有更深的理解再看,,,然后就是写一下代码实验一下,初步实现

//内存映射,关键函数  CreateFile()     CreateFileMapping()   MapViewOfFile()  ,记得退出随时把句柄给关了#include<iostream>#include<afxwin.h>#include<io.h>using namespace std;void main(){char *m_FFilePath = "F:\\1.txt";//获得文件的句柄HANDLE mFile = CreateFile(m_FFilePath,//文件路径GENERIC_READ | GENERIC_WRITE,//允许读写文件0, NULL, OPEN_EXISTING,//打开已存在的文件FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == mFile){return;}//返回值size_high, size_low分别为文件大小的高32位、低32位DWORD size_high, size_low;  size_low = GetFileSize(mFile, &size_high);  //我们可以在前面先设置好文件的大小,减小所占用的空间//创建文件的内存映射磁盘文件HANDLE fMapFile = CreateFileMapping(mFile, NULL, PAGE_READWRITE,   //对映射文件进行读写size_high, size_low,  //64位,为内存中可开辟的最大空间,NULL);if (INVALID_HANDLE_VALUE == fMapFile){CloseHandle(mFile);return;}//把文件数据映射到进程的地址空间,得到的地址m_diskRoomptr,我们就可用此更改或读写磁盘文件,感觉不错char *m_diskRoomptr = (char*)MapViewOfFile(fMapFile, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0,//这两个参数(偏移参数??我的理解),我们可以设置此参数,使得到的指针的首地址在不同的位置,这里设置  0,0  为文件的开头,//如果有分批次写入的话,可以记录写入总量,然后分为高低32位,写入   下次读写就能从上次结束的位置继续进行0);//设置的0,说说明整个文件映射,,,,可以设置固定的大小,之前文件的尺寸,精确一点if (!m_diskRoomptr){ASSERT(m_diskRoomptr);CloseHandle(fMapFile);CloseHandle(mFile);return;}int i = 0;//利用指针进行读写示例for (; i < 10; i++){ *(m_diskRoomptr + i)=i+'0';}for (i = 0; i < 10; i++){cout << *(m_diskRoomptr + i) << endl;}CloseHandle(fMapFile);CloseHandle(mFile);system("pause");}

嗯嗯就先这样了,做东西太不严谨了,还需要好好去努力,,ε=(´ο`*)))唉  这话说的都这么没底气!

以后好好努力。


原创粉丝点击