私は最近、いくつかの必要な最適化を行ってきました。私がやっていることの1つは、ostringstreams-> sprintfsを変更することです。私はたくさんのstd :: stringsをacスタイルの配列、alaにスプリントしています
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Microsoftのstd :: string :: c_str()実装は一定の時間で実行されることがわかりました(内部ポインターを返すだけです)。と思われるのlibstdc ++が同じことを行います。stdはc_strを保証しませんが、これを行う別の方法を想像するのは難しいと思います。たとえば、メモリにコピーした場合、バッファにメモリを割り当てる必要があります(呼び出し元に任せて破棄します-STLコントラクトの一部ではありません)または、内部staticにコピーする必要がありますバッファ(おそらくスレッドセーフではないため、その寿命については保証されません)。したがって、内部的に維持されているヌル終了文字列へのポインタを単に返すことが唯一の現実的な解決策のようです。
c_str
CONST方法である(又は少なくともconstの過負荷を有する-私は忘れて)、これは論理値を変更しないので、理由であってもよいですmutable
。それはですから、ポインタを破る他のコールにc_str
どのようにポインタが同じ論理文字列を参照しなければならないことを除いて、(その再配分する新たな理由はありません-すでにヌルターミネータがなければならない)、または他のすでに非への呼び出しが行われている必要があります-constメソッドの中間。