
クラスAの大きなサイズのオブジェクトを、
クラスBで処理するメソッドを書こうとしています。
◆質問
このとき、クラスBでは、byval で記載するのと、byrefで記載するのでは、
どちらの方がメモリを食わないのでしょうか?
◆自分の想定
(1)byrefで記載した場合、そのオブジェクトのポインタを受け取って処理するため、あんまりメモリは食わない。
(2)byvalで記載した場合、ある意味、.clone のような処理がされて、渡されたオブジェクトと同じサイズのメモリを食う?
※処理しようとしていることは、特に参照渡しされた変数の値を修正するような類ではないです。
なので、「オブジェクトを不用意にいじってしまう危険性」などの観点は無視し、メモリの観点の話です。
ちなみに、メソッドを、shareで宣言しようが、インスタンス化してからじゃないと使えないように宣言しようが、その関数のために使用されるメモリのサイズ(※クラスBのインスタンス化のためのメモリではないという意味)は変わらないということで合っていますでしょうか?
.
No.2ベストアンサー
- 回答日時:
えーっと,環境と言語は何でしょうか。
以下,VB on ASP.NETを想定します。
この環境ではByValだろうがByRefだろうがほとんど変わりません。
クラスは参照型であるため,ByValであっても参照を渡します。
このため,オブジェクト自体は渡されません。
よって,「オブジェクトのサイズ」ではなく「参照のサイズ」と「参照の参照のサイズ」の比較であり,実装依存ですが,おそらくどちらもポインタサイズ程度だと思われます。
# 参照とポインタは別物 (Type.IsPointerはC#でunsafeコードでポインタを書いた場合にTrueになる) ですが
メソッドはクラスメソッドもインスタンスメソッドも,メソッド本体は単一コードです。
# JITの都合とかそういうことを考えない場合。分岐予測を間違えすぎるとJIT差し戻しなどがあるため。
参照とポインタは別物なのですね。
クラスメソッドとインスタンスメソッドはメモリ的には変わらない件、助かりました。
ありがとうございます!
No.3
- 回答日時:
オブジェクトには、値型と参照型があります。
また文字列は参照型でありながら特殊です。
1.値型の値渡し
2.値型の参照渡し
3.参照型の値渡し
4.参照型の参照渡し
5.文字列の値渡し
6.文字列の参照渡し
実体のコピーが作られるのは1と5です
http://homepage1.nifty.com/rucio/main/dotnet/sho …
No.1
- 回答日時:
よほど大きなインスタンスでないと、今時のコンピュータのメモリー容量を考えれば、たいしたことはないという言い方もあるのですが・・・・
関数へオブジェクトを渡す時と言うことであれば、参照渡しの方がメモリー・CPUの処理量のどちらも軽くて済みます。
値渡しをしますと、インスタンスのコピーを生成するので、その分のメモリーとCPUの処理が必要ですが、参照渡しであれば、単純にインスタンスが存在するメモリーのアドレスを渡すだけで済みますので。
ただし、あくまで、メモリーアドレスの内部表現よりインスタンスの内部表現の方が大きい場合です。
極端な話、byteタイプの変数であれば、理論上は値渡しの方がメモリー消費は軽くてすむようにできますが、この辺は、言語の実装によります。
やはりbyvalはインスタンスのコピーの分、メモリを食うんですね。
Datatableとかは参照渡しの方が良いのでしょうね。
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- CPU・メモリ・マザーボード Windows10 64bitパソコンのメモリ 4GBから8GBへ増設 11 2023/01/25 18:20
- その他(プログラミング・Web制作) Pythonのデータ型 2 2023/04/26 12:53
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- CPU・メモリ・マザーボード ノートパソコンでクロック数の違うメモリを1枚ずつ挿してデュアルチャンネルになりますか? 1 2022/11/18 00:30
- その他(自然科学) 論文のまとめに関して(小論文)添削お願いします。 6 2023/07/16 14:24
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# panel内のコントロールの使...
-
VB6では、Applicationは未定義...
-
Excel2003VBAからIE64bitを制御
-
クラスの設定について
-
ADODB.Connectionはインターフ...
-
VBA チェックボックスをオーバ...
-
一クラス何ステップ以上で読む...
-
任意の解像度のメモリデバイス...
-
VB6.0の関数をC++で使いたい
-
コンストラクタについて
-
c# Equalsメソッドについて
-
VisualStudio2005
-
【VC++】クラスの追加方法について
-
ダイアログ表示時にチェックボ...
-
C++でのDirectXプログラミング...
-
正規表現 [^/]+ の意味を教えて
-
Visual studio express 2013 ...
-
クラスプロジェクトのデバッグ
-
MFC VC++ 6.0 使用
-
Serialize で困ってます!!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
C# panel内のコントロールの使...
-
delete演算子によるメモリ解放...
-
CreateObjectとはどういう意味...
-
関数で値渡しと参照渡しではど...
-
ボタンを押すとラベルの文字を...
-
オブジェクトをどこでdisposeす...
-
クラス内にWin32APIのコールバ...
-
コンストラクタ内でのthisポインタ
-
【VC++6.0(MFC)】「Out of memo...
-
C#でのUNZIP32.DLLの利用方法が...
-
SetとNothingの存在意味?
-
一時オブジェクト?の生存期間
-
「R = ActiveCell」がエラーに...
-
最小化したフォームを元に戻す
-
DataGridViewがクラッシュする
-
クラス?オブジェクト?インス...
-
メモリ解放について、ご教授く...
-
メモリリークが発生するのはど...
-
UMLでの「オブジェクト」と「イ...
おすすめ情報