本文在前文的基礎上作了一下擴展安全
<DataDef> <Field key="cardNo" length="19"/> <Field key="amount" length="13"/> <Field key="tradeDate" length="8"/> <Field key="tradeTime" length="6"/> </DataDef>
數據key | 長度 | 偏移 |
cardNo | 19 | |
amount | 13 | 20 |
tradeDate | 8 | 36 |
tradeTime | 6 | 48 |
數據的內部存儲方式可用字符串形式,無論是整數,浮點數,數據讀取和寫入的接口最核心的就是相似這種形式: 數據結構
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系統中,內部結構數據可放在共享內存中,這樣多進程均可訪問(如有須要可將數據的訪問接口實現成線程安全的),無需將數據在進程間進行傳遞。設計