- ベストアンサー
stringについて
確認したいのですが、ある関数の引数はconst string& strでやる場合 文字列リテラルは、ヒープが確保してそれをポインタであるstringに渡される。だからコピーされる手間が減るとういことでよろしいのでしょうか? 環境はvisual C++ 2005です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 何と比較するのかというとstring str です。 「const string &str」と「const string str」の違いについては、 &付き(参照渡し)の場合は、string オブジェクトへのポインタが関数に渡されるため、オブジェクトのコピーは発生しません。 &無し(値渡し)の場合は、string オブジェクトの複製が作られるため、そこでオーバーヘッドが発生します。 オブジェクトを複製する際に、どういうオーバーヘッドが発生するのかは実装依存です。 文字列の実データはオブジェクト毎にヒープを確保するような実装であれば、オブジェクトの複製時に、ヒープなどへのメモリ確保とコピーが行われますが、 参照カウンタを用いた実装であれば、文字列の実データそのもののコピーは行われません。(それでも、オブジェクトの複製処理のオーバーヘッドはある程度発生しますので、参照渡しの方がオーバーヘッドは少ないでしょう) const の有無については、今回の話の大筋には関係ありません。 「const string &str」と「string &str」の違いであれば、メモリ確保などの基本的な取り扱いは同じです。 ですが、constが付いている=書き換えられる心配がない、ということから、より最適化されて、もしかしたらコピーが減るかもしれません。 > あとこういうのは、stringに限ったことなのでしょうか? 上述の通り、参照渡しでオーバーヘッドが減るのは、string に限った話ではありません。 オブジェクト一般について「参照渡しにした方がオーバーヘッドは少ない」と言えます。
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
質問「constについて」の時の回答にもありましたけど、 「const string& str」と「何」とを比較するのかが言及されていませんので、 「コピーされる手間が減るのか」と聞かれても答えようがありません。 あとは、実装依存の話ですが、 多くの実装では、string の実データはヒープ上に確保するようになってますが、 VC++では、15文字以下の場合、ヒープを使わないようになってるらしいです。 http://d.hatena.ne.jp/AMENOHI/20090207 この場合、自動変数などスタック上に確保したstring型オブジェクトなら、 15文字以下なら文字列データも一緒にスタック上にあることになります。
お礼
回答ありがとうございます。そうだったのですか。15文字以下はヒープを使っているのですね。何と比較するのかというとstring str です。
補足
あとこういうのは、stringに限ったことなのでしょうか?
- php504
- ベストアンサー率42% (926/2160)
strを文字列リテラルで初期化したということでしょうか(string str = "ABC";) 文字列リテラル(上の"ABC")はヒープには無いでしょう strには文字列リテラルをコピーした文字列があるでしょうがそれがスタックかヒープかはわかりません。
お礼
回答ありがとうございます。初期化ではなく仮引数にした場合です。
お礼
なるほど。わかりました。ポインターが関数に渡されてオブジェクトのコピーはしないのですね。回答ありがとうございました。