私のプログラムで作成された std::wstring のオブジェクトはたくさんありますが、
std::wstring mystr(L"test string");
入力 wchar 文字列は文字列定数であるため、mystr が L"test string" のアドレスに等しい mystr.c_str() として構築されている場合、ヒープの使用量をいくらか節約できます。そのような wstring を構築することは可能ですか?
私のプログラムで作成された std::wstring のオブジェクトはたくさんありますが、
std::wstring mystr(L"test string");
入力 wchar 文字列は文字列定数であるため、mystr が L"test string" のアドレスに等しい mystr.c_str() として構築されている場合、ヒープの使用量をいくらか節約できます。そのような wstring を構築することは可能ですか?
いいえ。そうするために、の実装は文字列リテラルから来たstd::basic_string
かどうかに関する追加情報を必要とし、この情報は単に利用できません。wchar_t const*
そして、たとえそうであったとしても、引数が。でなかったとしても、クラスを使用するコストが増加しますwchar_t const*
。
これらの文字列がグローバルスコープにある場合、それらを構築するためのコストは起動時のみです。そして、それらがローカル変数である場合、いつでも宣言できるstatic
ので、それらを構築するためのコストは、ブロックに入るたびではなく、一度だけ支払われます。
これには確かに有効なユースケースがありますが、C++文字列クラスはそれをサポートしていません。本当に必要な場合は、インターンをサポートする独自の文字列クラスを作成する必要があります。
他のいくつかの言語がこれをネイティブにサポートしていることに注意してください。残念ながら、C ++文字列クラスは、一般的なユースケース(本質的に不変の文字列のコピーの多く)ではなく、かなり特定のユースケース(多くの変更)をカバーしています。
wchar_t
タスクを単純化するために、静的メモリ内のバッファの開始と終了を指すことができる(const)イテレータのペアの周りにシンラッパークラスを使用するだけで十分かどうかを検討してください。