悪い人
これは古い質問ですが、C++1z/C++2a の時点でもVisual Studio 2019
、stringstream
バッファを予約する理想的な方法はありません。
この質問に対する他の回答は、次の理由によりまったく機能しません。
いいもの
このコード セグメントss
は、要求されたサイズで事前に割り当てられているため、期待どおりに機能します。
std::string dummy(reserve, '\0');
std::stringstream ss(dummy);
dummy.clear();
dummy.shrink_to_fit();
コードはワンライナーとして書くこともできますstd::stringstream ss(std::string(reserve, '\0'));
。
ぶさいく
このコード セグメントで実際に行われることは次のとおりです。
dummy
リザーブが事前に割り当てられ、その後、バッファは null バイトで埋められます (コンストラクタに必要)。
stringstream
ダミーで構成されています。これにより、文字列の内容全体が、事前に割り当てられた内部バッファーにコピーされます。
dummy
その後、クリアされてから消去され、その割り当てが解放されます。
これは、 a を事前に割り当てるためにstringstream
、2 つの割り当て、1 つのフィル、1 つのコピーが行われることを意味します。最悪の部分は、式の実行中に、目的の割り当てに 2 倍のメモリが必要になることです。うわぁ!
ほとんどのユースケースでは、これはまったく問題にならない可能性があり、追加のフィルとコピー ヒットを使用して再割り当てを少なくしても問題ありません。