LLVM(5)Twine類を勉強します.

2495 ワード

クラスTwineはファイルllvm/include/ADT/Twine.hに定義されています.
参照:http://llvm.org/docs/ProgrammersManual.html#Twine
==キャプション==Twineは、文字列の接続を効率的に表現するための軽いデータ構造です.
Twineはrope(直列)で、二叉の木を使って接続の文字列を表しています.結果、文字列は二叉のツリーノードが前の順序でつなぎ合わせられています.文字列スティッチングの結果が必要な場合にのみ、このようなスティッチングを最終的なブザーに行うことができるので、複数の文字列スティッチングの中に一時的なstringオブジェクトを発生させないようにすることができます.
Twinオブジェクトは、一般的にスタックに割り当てられていますが、文が終わると自動的に解放されます.このため、一般的にはTwineオブジェクトを保存せず、パラメータとしての伝達が多く使われています.
==実現==
class Twine {
  union Child LHS, RHS;  //      、   。
  char/*enum NodeKind*/ LHSKind, RHSKind;  //        。
  Twine(...)  //           * 1
  concat()    //   (Twine = Twine + Twine)
  str() //       ,     std::string
  toVector() //        vector<char>
  toStringRef(),toNullTerminatedStringRef() //       StringRef
  print(),dump() //   、   Twine。
}
//         Twine      '+'    ,  operator+(StringRef&, char*)  。
 
*注1:Twine(const long long&Val)を構成していますが、実際にValのポインタを保存するため、Valはここで引用を使用しています.使用者は自分でValのメモリを合法的に確保する必要があります.
*enum NodenKineはTwineの左右のノードの可能性のあるすべてのタイプを宣言しました.主に*Null Kind--空の文字列があります.どの文字列も連結結果はNullです.CStringKind--ノードはconst char****StdStringKindである.ノードはstdである.sting****StringRefKind--ノードはStringRef**Charnndである.ノードは1文字である.DecUICKindなどの多種類の数字タイプで、符号のある、符号のない、32、64桁のがあります.*UHexKind--16進数の書式の数字を出力します.
*union_Childは、enum_Nodenndに対応して、ノードタイプごとにどのようなデータを保存するかを定義しています.sizeof==4は、データが4バイト以内に直接保存される場合、ポインタ(std::sting*)が保存されます.
==例==
StringRef sr1 = StringRef("world", 5);
std::string s1 = "LLVM!";
Twine t("Hello "); //        Twine   const char *
Twine t2 = t.concat(sr1);   // t2 = "Hello world"
Twine t3 = t2 + " from ";   // t3 = "Hello world from "
Twine t4 = t3.concat(s1);   // t4 = "Hello world from LLVM!"
std::string s2 = t4.str();  //    "Hello world from LLVM!"
Twine t5 = t4 + " And          : " + Twine(123);
 
==メカニズムと問題を実現する=*Twineで解決する問題は文字列のつなぎ合わせです.プログラムには、文字列を一時的につなぎ合わせて、他の関数にパラメータを提供する必要があります.**  まず、スティッチングされた文字列パラメータは使用されないかもしれません.遅延スティッチングは空間配分の消費を減らすことができます.*  二重スプラインの場合、例に示すように、Twineは二叉樹を使ってスティッチング式、すなわちテンプレート式を保存し、最後に結果が必要となる(.str()の時に実際の文字列スティッチングを行うことで、分配を大量に節約し、メモリを解放するために必要な高価な操作ができます.
*現在のTwine.str()の方法ではSmallStering<256>をスティッチング文字列として使用する一時空間として使用し、再帰的呼び出しを使用して左右のノードを巡回してスティッチング結果を生成する.今後はより良い方法で実際の統合ができるかもしれません.ノードが保存可能なのはstd:string、StringRef、long longのポインタであるため、ポインタが指すデータはTwineの使用期間内に生存を確保する.不注意で使うと、予知できない結果になります.