LLVM(5)Twine類を勉強します.
2495 ワード
クラスTwineはファイルllvm/include/ADT/Twine.hに定義されています.
参照:http://llvm.org/docs/ProgrammersManual.html#Twine
==キャプション==Twineは、文字列の接続を効率的に表現するための軽いデータ構造です.
Twineはrope(直列)で、二叉の木を使って接続の文字列を表しています.結果、文字列は二叉のツリーノードが前の順序でつなぎ合わせられています.文字列スティッチングの結果が必要な場合にのみ、このようなスティッチングを最終的なブザーに行うことができるので、複数の文字列スティッチングの中に一時的なstringオブジェクトを発生させないようにすることができます.
Twinオブジェクトは、一般的にスタックに割り当てられていますが、文が終わると自動的に解放されます.このため、一般的にはTwineオブジェクトを保存せず、パラメータとしての伝達が多く使われています.
==実現==
*注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*)が保存されます.
==例==
==メカニズムと問題を実現する=*Twineで解決する問題は文字列のつなぎ合わせです.プログラムには、文字列を一時的につなぎ合わせて、他の関数にパラメータを提供する必要があります.** まず、スティッチングされた文字列パラメータは使用されないかもしれません.遅延スティッチングは空間配分の消費を減らすことができます.* 二重スプラインの場合、例に示すように、Twineは二叉樹を使ってスティッチング式、すなわちテンプレート式を保存し、最後に結果が必要となる(.str()の時に実際の文字列スティッチングを行うことで、分配を大量に節約し、メモリを解放するために必要な高価な操作ができます.
*現在のTwine.str()の方法ではSmallStering<256>をスティッチング文字列として使用する一時空間として使用し、再帰的呼び出しを使用して左右のノードを巡回してスティッチング結果を生成する.今後はより良い方法で実際の統合ができるかもしれません.ノードが保存可能なのはstd:string、StringRef、long longのポインタであるため、ポインタが指すデータはTwineの使用期間内に生存を確保する.不注意で使うと、予知できない結果になります.
参照: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の使用期間内に生存を確保する.不注意で使うと、予知できない結果になります.