本文在前文的基础上做了一下扩展
内部数据结构定义
内部的数据结构配置文件可采用xml文件形式,文件格式其实很简单,例子如下
比如这次内部结构含4个字段,含一次交易信息的卡号,金额,交易日期,交易时间,载入这个配置后,内存中的数据映射关系如下:
数据key | 长度 | 偏移 |
cardNo | 19 | |
amount | 13 | 20 |
tradeDate | 8 | 36 |
tradeTime | 6 | 48 |
考虑到计算效率,比如32系统中,实际分配的存储长度是比xml文件配置的长度大的最小的4的整数倍数,这样偏移量就是4的整数倍。
数据内部存储与访问方式
数据的内部存储方式可用字符串形式,不管是整数,浮点数,数据读取和写入的接口最核心的就是类似这种形式:
int getDataStr(const void* dataAddr, const char* szKey, const int iBufLen, char* szValue);int putDataStr(void* dataAddr, const char* szKey, const char* szValue);
dataAddr是所有的数据存储地址,根据szKey查找到对应数据的偏移(如果数据域多可在载入配置后可将key排序,查找时通过二分查找等方法),之后进行读取或者写入,至于其他的类型在这个基础上将字符与成整型,浮点型等互转即可。而且数据内部天然带长度,在写入的时候可以进行检查,不能超过xml文件中的长度,在一个地方限制了内存溢出的BUG。
int getDataInt(const void* dataAddr, const char* szKey, int* iValue);int setDataInt(void* dataAddr, const char* szKey, const int iValue);int getDataDouble(const void* dataAddr, const char* szKey, double* dValue);int setDataDouble(void* dataAddr, const char* szKey, const double dValue);
到此已经完成了一个最简单的设计,相对真正的动态Map的实现最大的区别是所有用到的值的key必须预先定义好,但是值所放置的位置在载入时都已经确定,在访问时不需要进行动态的内存申请和释放,保证了一定的效率,而且在Linux/Unix系统中,内部结构数据可放在共享内存中,这样多进程都可访问(若有需要可将数据的访问接口实现成线程安全的),无需将数据在进程间进行传递。