類 StringRef 定義在文件 llvm/include/ADT/StringRef.h 中html
== 說明 ==
StringRef 數據類表示一個固定不變的字符串的引用(包括一個字符數組的指針和長度),它支持可用在 std::string 類上的各類通用字符串操做,可是不須要進行內存的分配。所引用的字符串不須要以 null 字符結尾。數組
StringRef 本身不擁有字符串數據,在使用 StringRef 的時候指望字符串放在別的地方,而存放的地方的聲明週期要超過 StringRef 的。所以,通常保存 StringRef 本身是不安全的。安全
StringRef 能夠引用一個外部實際字符串的一部分,例如 const char *s = "abcdefg",
StringRef(s+1, 4) 表示引用從s+1 位置開始的長度爲 4 的子字符串,也即 "bcde"。函數
參見:http://llvm.org/docs/ProgrammersManual.html#StringRef性能
== 實現 ==
StringRef 的實現簡化以下:設計
class StringRef { const char *Data; // 字符串的開始位置,指向一個外部的緩衝區(不屬於 StringRef 管理) size_t Length; // 字符串的長度。 StringRef(...) // 多種形態的構造函數 data(), size() // 得到 Data, Length 的 inline 函數。 begin(), end(), empty(), size(), front(), back(), [] 等相似於 STL 容器標準方法的函數。 equals(), compare(), startswith(), find(), substr(), split() 等通常字符串操做 std::string, str() // 轉換爲標準 std::string // 其它略 } 多個 StringRef 二元操做符 operator <, >, ==, !=, >=, <=, += 的重載。 模板 isPodLike<StringRef> 的特化,可將 StringRef 做爲 POD 數據對待。
* StringRef 實例比較小(sizeof 值爲 8),它足夠小於是能夠直接做爲參數傳遞,或做爲返回值類型。指針
== 爲什麼要設計 StringRef 類等問題 ==
* 我認爲是 LLVM 在設計和實現上高度追求性能,在類的設計使用上力求精確、高效。在一些場合,字符串已知有擁有者,須要傳遞其所有或部分字符串到別的函數,此時,使用 StringRef 能夠減小字符串分配、分割、裁剪等各類操做帶來的空間需求。
* StringRef 中保存了字符串長度 Length 信息,所以在計算 strlen() 的時候可以節省一些時間,從而提升對長字符串計算長度時的性能。並且能夠支持中間帶有 null 字符的字符串。
* 配合 Twine 類,StringRef 的各類操做可能更有價值。code
* 然而我在代碼中也看到過對 std::string 進行 StringRef 引用,然後在另外一個地方再次使用 str() 函數獲得新分配的 std::string,這樣不良的使用也會形成沒必要要的屢次重複分配。有什麼更好的辦法來解決這種問題嗎?
htm