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");}
嗯嗯就先这样了,做东西太不严谨了,还需要好好去努力,,ε=(´ο`*)))唉 这话说的都这么没底气!
以后好好努力。
阅读全文
1 0
- c++内存映射初学
- Linux C 文件内存映射
- C++Builder实现内存映射
- C语言mmap()函数:建立内存映射
- Linux C下的内存映射函数
- linux c 通过内存映射,操作文件
- C将变量映射到内存
- 初学c++,释放动态数组内存出现的问题解决
- C语言 mmap()函数(建立内存映射) 与 munmap()函数(解除内存映射)
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- mysql 输出表的详细信息 show table status like '表名'
- Centos7中firewall基本应用
- 打印所有不超过256,其平方具有对称性质的数(也称回文数,例如22的平方是484, 484是回文数。则打印22 和484)。
- lambda 函数所引起的闭包问题
- 36.开源项目--git搭建本地Git服务器
- c++内存映射初学
- MySQL--在批处理中执行SQL
- Android Studio中导入SlidingMenu(详解)
- 计算机视觉简介:历史、现状和发展趋势
- mysql 命令备忘
- ccf-csp
- LAMP环境搭建与配置(一)
- (二十四)Webservice CXF
- 有句俗话“三天打鱼两天晒网”,假设小明从1990年1月1日起开始“三天打鱼两天晒网”,问小王在以后的某一天是在“打鱼”,还是在“晒网”?(键入日期,显示结果打鱼or晒网)。