首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言應用服務器內部數據結構(三):列表支持與完整體系總結

     編輯:關於C語言

列表類型設計回顧

為滿足查詢類業務「返回多筆同結構記錄」需求,引入 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);

DataList 結構體定義

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/JSON 庫。
  • ❌ 複雜對象圖、遞歸結構:需序列化框架(Protobuf/FlatBuffers/Cap'n Proto)。

系列總結

三篇文章構建了「配置驅動 → 靜態佈局 → 類 Map 接口 → 列表擴展」完整體系。核心價值:
🎯 開發期靈活:改 XML 不改代碼
🎯 運行期高效:零分配、零虛函數、緩存友好
🎯 部署期簡單:單二進制 + XML,熱更配置即可
這是在 C 語言約束下,用「約定優於配置、靜態優於動態」思想實現的工程最優解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved