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

StdExt String (BasicString):不管理生命週期的輕量常字符串

     編輯:關於C++

背景:STL string 的三大痛點

  1. 接口冗餘且與容器不一致(如 find 用下標而非迭代器)
  2. 頻繁構造/析構導致嚴重內存碎片
  3. Copy-On-Write (COW) 在多線程下鎖開銷巨大,現代 STL 已棄用 COW

StdExt 的解決方案:將字符串拆分為常字符串 String (BasicString) 與字符串操作類 StringBuilder,參考 Java 設計哲學。

BasicString 極簡結構:僅兩個成員

template <class _E>
class BasicString {
    const _E* m_pszBuf; // 指向外部數據,不以 \0 結尾
    size_t m_length;    // 顯式長度
};

四大差異特徵

  • 不可變: 永不修改 m_pszBuf 指向的數據
  • 無析構邏輯: 視同 POD 結構體,僅有構造函數便利構建
  • 非以 \0 結尾: 長度由 m_length 決定,支持嵌入 \0 字符
  • 不管理生命週期: 不擁有、不釋放緩衝區,僅「借用」或「產生」數據視圖

不管理生命週期的設計智慧

這看似反直覺,實則解鎖極致輕量操作:

  • 賦值/子串 = O(1) 指針拷貝: 完全省去 COW 機制與鎖開銷
  • 零成本轉換: 任意線性容器(vector、string、數組)可通過 cast() 瞬間轉為 String 視圖,無分配、無拷貝
  • 所有權外部化: 由調用方、分配器、或上層容器(StringBuilder/TextPool)統一管理內存,符合現代 C++ 「所有權清晰」原則

構造函數契約:明確所有權意圖

// 情況 1:外部緩衝區生命週期 ≥ String 對象(零拷貝借用)
BasicString(const value_type* pszVal, size_type cch);

// 情況 2:外部緩衝區臨時有效,需拷貝副本(由分配器 alloc 分配新內存)
template <class AllocT>
BasicString(AllocT& alloc, const value_type* pszVal, size_type cch);

刻意移除 BasicString(const value_type*),強制調用方聲明長度與所有權意圖,消除隱式轉換陷阱。

TempString 基類:實現細節的泛化樞紐

TempString 本質是「特殊生命週期的 String」,作為 BasicString 基類純屬實現便利。其構造函數每增加一種線性字符串支持(如 vector<char>),所有 BasicString 操作(compare、find、concat 等)自動獲得該類型支持——一個函數抵六個重載。

全局 concat:異構字符串高效拼接

std::String a = std::concat(alloc, "Hello", " ", "world", "!!!");
// 支持混合:std::string, char*, std::vector<char>, String, StringBuilder...

單次分配、按需拷貝,性能遠超鏈式 operator+。

總結

BasicString 通過「不持有、不修改、不管理生命週期」的極簡契約,實現了常字符串的零開銷抽象,成為 StdExt 字符串體系的基石。

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