プロが教えるわが家の防犯対策術!

クラスAの大きなサイズのオブジェクトを、
クラスBで処理するメソッドを書こうとしています。

◆質問
このとき、クラスBでは、byval で記載するのと、byrefで記載するのでは、
どちらの方がメモリを食わないのでしょうか?

◆自分の想定
(1)byrefで記載した場合、そのオブジェクトのポインタを受け取って処理するため、あんまりメモリは食わない。
(2)byvalで記載した場合、ある意味、.clone のような処理がされて、渡されたオブジェクトと同じサイズのメモリを食う?

※処理しようとしていることは、特に参照渡しされた変数の値を修正するような類ではないです。
なので、「オブジェクトを不用意にいじってしまう危険性」などの観点は無視し、メモリの観点の話です。

ちなみに、メソッドを、shareで宣言しようが、インスタンス化してからじゃないと使えないように宣言しようが、その関数のために使用されるメモリのサイズ(※クラスBのインスタンス化のためのメモリではないという意味)は変わらないということで合っていますでしょうか?
.

A 回答 (3件)

よほど大きなインスタンスでないと、今時のコンピュータのメモリー容量を考えれば、たいしたことはないという言い方もあるのですが・・・・



 関数へオブジェクトを渡す時と言うことであれば、参照渡しの方がメモリー・CPUの処理量のどちらも軽くて済みます。
 値渡しをしますと、インスタンスのコピーを生成するので、その分のメモリーとCPUの処理が必要ですが、参照渡しであれば、単純にインスタンスが存在するメモリーのアドレスを渡すだけで済みますので。

 ただし、あくまで、メモリーアドレスの内部表現よりインスタンスの内部表現の方が大きい場合です。
 極端な話、byteタイプの変数であれば、理論上は値渡しの方がメモリー消費は軽くてすむようにできますが、この辺は、言語の実装によります。
    • good
    • 0
この回答へのお礼

やはりbyvalはインスタンスのコピーの分、メモリを食うんですね。
Datatableとかは参照渡しの方が良いのでしょうね。

ありがとうございます!

お礼日時:2013/04/01 20:45

えーっと,環境と言語は何でしょうか。


以下,VB on ASP.NETを想定します。

この環境ではByValだろうがByRefだろうがほとんど変わりません。
クラスは参照型であるため,ByValであっても参照を渡します。
このため,オブジェクト自体は渡されません。
よって,「オブジェクトのサイズ」ではなく「参照のサイズ」と「参照の参照のサイズ」の比較であり,実装依存ですが,おそらくどちらもポインタサイズ程度だと思われます。
# 参照とポインタは別物 (Type.IsPointerはC#でunsafeコードでポインタを書いた場合にTrueになる) ですが

メソッドはクラスメソッドもインスタンスメソッドも,メソッド本体は単一コードです。
# JITの都合とかそういうことを考えない場合。分岐予測を間違えすぎるとJIT差し戻しなどがあるため。
    • good
    • 0
この回答へのお礼

参照とポインタは別物なのですね。
クラスメソッドとインスタンスメソッドはメモリ的には変わらない件、助かりました。

ありがとうございます!

お礼日時:2013/04/01 20:39

オブジェクトには、値型と参照型があります。


また文字列は参照型でありながら特殊です。

1.値型の値渡し
2.値型の参照渡し
3.参照型の値渡し
4.参照型の参照渡し
5.文字列の値渡し
6.文字列の参照渡し

実体のコピーが作られるのは1と5です

http://homepage1.nifty.com/rucio/main/dotnet/sho …
    • good
    • 0
この回答へのお礼

参照型は値渡ししてもcloneのようにはならないんですね。
ありがとうございました!

お礼日時:2013/04/01 20:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!