- ベストアンサー
関数で値渡しと参照渡し、どちらがメモリを使用するのか?
- 関数でのオブジェクトの引数受け渡しには、値渡しと参照渡しの2つの方法があります。
- 値渡しの場合、オブジェクトのコピーを作成して引数として渡されます。
- 参照渡しの場合、オブジェクトへのポインタが引数として渡されるため、メモリの使用量は比較的少なくなります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えーっと,環境と言語は何でしょうか。 以下,VB on ASP.NETを想定します。 この環境ではByValだろうがByRefだろうがほとんど変わりません。 クラスは参照型であるため,ByValであっても参照を渡します。 このため,オブジェクト自体は渡されません。 よって,「オブジェクトのサイズ」ではなく「参照のサイズ」と「参照の参照のサイズ」の比較であり,実装依存ですが,おそらくどちらもポインタサイズ程度だと思われます。 # 参照とポインタは別物 (Type.IsPointerはC#でunsafeコードでポインタを書いた場合にTrueになる) ですが メソッドはクラスメソッドもインスタンスメソッドも,メソッド本体は単一コードです。 # JITの都合とかそういうことを考えない場合。分岐予測を間違えすぎるとJIT差し戻しなどがあるため。
その他の回答 (2)
- todo36
- ベストアンサー率58% (728/1234)
オブジェクトには、値型と参照型があります。 また文字列は参照型でありながら特殊です。 1.値型の値渡し 2.値型の参照渡し 3.参照型の値渡し 4.参照型の参照渡し 5.文字列の値渡し 6.文字列の参照渡し 実体のコピーが作られるのは1と5です http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard34.htm
お礼
参照型は値渡ししてもcloneのようにはならないんですね。 ありがとうございました!
- mitoneko
- ベストアンサー率58% (469/798)
よほど大きなインスタンスでないと、今時のコンピュータのメモリー容量を考えれば、たいしたことはないという言い方もあるのですが・・・・ 関数へオブジェクトを渡す時と言うことであれば、参照渡しの方がメモリー・CPUの処理量のどちらも軽くて済みます。 値渡しをしますと、インスタンスのコピーを生成するので、その分のメモリーとCPUの処理が必要ですが、参照渡しであれば、単純にインスタンスが存在するメモリーのアドレスを渡すだけで済みますので。 ただし、あくまで、メモリーアドレスの内部表現よりインスタンスの内部表現の方が大きい場合です。 極端な話、byteタイプの変数であれば、理論上は値渡しの方がメモリー消費は軽くてすむようにできますが、この辺は、言語の実装によります。
お礼
やはりbyvalはインスタンスのコピーの分、メモリを食うんですね。 Datatableとかは参照渡しの方が良いのでしょうね。 ありがとうございます!
お礼
参照とポインタは別物なのですね。 クラスメソッドとインスタンスメソッドはメモリ的には変わらない件、助かりました。 ありがとうございます!