本来程序中一些数据需要在下次重启后能够恢复继续使用,一般比较好的办法是直接嵌入sqlite数据库或者嵌入leveldb,但是需要引入第三方库,略麻烦,因此打算自己实现。
实现思路
自己实现最简单就是使用WinAPI操作INI文件,一个读API一个写API,非常简单方便,但是曾经出现过一个项被写两次的问题,心有余悸,另外也可以预见这种频繁的API操作肯定对磁盘性能有影响。
另外一种自定义格式写文件,将文件读取出来,需要写入的时候更新内存并刷新到磁盘文件,同样相对可靠性能没那么好。
不过,基于上面的思想,其实我们可以使用内存映射的方式来实现。
实现方法
内存映射思想就是将文件映射成一片内存,然后操作内存就相当于操作文件,这样其实操作也方便,性能也好,但是因为是内存操作,需要自己去做内存分布排列,这是需要注意的地方。实现过程大概如下
- 使用CreateFile打开文件
- 创建内存映射,空文件映射会失败
- 获取映射内存,映射大小必须不能大于文件大小
由于第一次使用,会创建缓存文件,且缓存文件大小为0,因此当文件为空时,需要往里面写一次数据,以保证创建内存映射成功。
HANDLE file = CreateFile("cache.m", GENERIC_READ|GENERIC_WRITE, |
这样就映射成功了,直接操作 mem
地址的内存就相当于操作文件,注意内存已经固定为 len
长度了,写入需要注意。上面例子是通过 struct CacheStruct
管理内存分布的,简单的定义为固定数组形式的结构。
struct CacheStruct { |
其他想法
总体上相当于是有一块内存可使用了,那么可以通过 palcement new 实现一些功能。另外就是自实现类似 vector
之类的容器。