そのため、文字列を結合する場合、多くの場合、次のような一定のコンポーネントがあります。
std::string s;
s += initial_string;
s += "const string";
s += terminating_string;
これは単なるデモンストレーションです。文字列操作は、かなり複雑で詳細になる可能性があります。そのため、const 部分を実行すると、実装は長さを「認識しない」ことになり、効果的に実行さstrlen()
れます。長さはコンパイル時にわかっているため、これは明らかに無駄です。const 文字列部分をこれに置き換えると、かなり高速になることをテストしました (何らかの理由で x64 ではかなり高速です)。
s.append("const string",12);
実際に文字を数えるのは煩わしく、時間がかかり、エラーが発生しやすいため、これは少し優れています。
s.append("const string",sizeof("const string")-1);
これはまだエラーが発生しやすい (つまり、最初の部分を変更するが、2 番目の部分を変更するのを忘れる) ため、マクロがこれを助けることができます。
#define strnsizeof(s) s,sizeof(s)-1
s.append(strnsizeof("const string"));
質問1:これに対するより良い/よりクリーンなソリューションを持っている人はいますか?
<<
また、演算子を使用して文字列やその他のさまざまなオブジェクト型を連結する拡張文字列クラスもあります。同様の問題がここにありますが、これは(私にとって)素晴らしくてきれいです:
s << initial_string << "const string" << terminating_string;
自分のオブジェクト型 (長さはコンポーネント) の演算子がある場合、追加操作は高速で簡単ですが、const char *
ここで再び取得すると、コンパイル時に一定であっても長さが得られません。const char *
したがって、次の行に沿って a と長さを取る小さな構造を作成することで、それを高速化できます。
s << initial_string
<< MyStr::ConstBuf(strnsizeof("const string"))
<< terminating_string;
少年は醜くなっています。したがって、それもマクロ化できます。たとえば、次のようになります。
#define MyStrConst(s) MyStr::ConstBuf(s,sizeof(s)-1)
s << initial_string
<< MyStrConst("const string")
<< terminating_string;
より良いですが、素晴らしいとは言えません。
質問 2: 定数文字列をカプセル化するよりも優れた/よりクリーンなソリューションを得た人はいますか?