為滿足查詢類業務「返回多筆同結構記錄」需求,引入 type="list":
// 基礎標量
int getDataStr(const void* addr, const char* key, int bufLen, char* val);
int putDataStr(void* addr, const char* key, const char* val);
int getDataInt(...); int putDataInt(...);
int getDataDouble(...); int putDataDouble(...);
// 列表
int getDataList(const void* addr, const char* key, DataList* list);
int getDataInList(const void* addr, const DataList* list, int idx,
const char* fieldKey, int bufLen, char* val);
int putDataInList(void* addr, const DataList* list, int idx,
const char* fieldKey, const char* val);
typedef struct {
const void* baseAddr; // 數據塊基址
size_t listOffset; // 列表在塊內偏移
size_t elementSize; // 單元素大小(含對齊)
int maxCount; // 配置 size
const FieldMap* subMap; // 二級映射表指針
int subMapCount; // 二級字段數
} DataList;
getDataInList(addr, list, 2, "name", ...) │ ├─ 1. 計算元素基址 = addr + list.listOffset + 2 * list.elementSize │ ├─ 2. 在 list.subMap 中二分查找 "name" → 得到 fieldOffset, fieldLen │ └─ 3. memcpy(dst, 元素基址 + fieldOffset, min(bufLen, fieldLen))
| 能力 | 支持 | 實現方式 |
|---|---|---|
| 標量字段 | ✅ | 一級映射 + memcpy |
| 固定長度列表 | ✅ | 二級映射 + 索引計算 |
| 變長列表 | ❌ | 需擴展:size 改為 max,另存 count 字段 |
| 嵌套列表 | ❌ | 遞歸定義 ListDataDef 引用自身 |
| 共享內存 | ✅ | 純字節塊,無指針 |
| 線程安全 | 可選 | 外部鎖或字段級原子操作 |
| 版本演進 | ✅ | 新增字段不影響舊偏移 |
三篇文章構建了「配置驅動 → 靜態佈局 → 類 Map 接口 → 列表擴展」完整體系。核心價值:
🎯 開發期靈活:改 XML 不改代碼
🎯 運行期高效:零分配、零虛函數、緩存友好
🎯 部署期簡單:單二進制 + XML,熱更配置即可
這是在 C 語言約束下,用「約定優於配置、靜態優於動態」思想實現的工程最優解。