C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: インスタンス化する時は、どちらが良いのでしょうか?


(過去ログ 91 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■54218 / inTopicNo.1)  インスタンス化する時は、どちらが良いのでしょうか?
  
□投稿者/ まっさ (5回)-(2010/10/10(Sun) 02:21:29)

分類:[.NET 全般] 

この1,2のパターンの場合、結果的に何かかわるのでしょうか?

なんとなく1は無駄にメモリを消費しそうなイメージですが・・・

それとも2の場合、新しいインスタンスが生成されても、その時点で
前のインスタンスが消えるわけでは無いですよね?(ただ参照できないだけ?)
だったら結果的には同じなんでしょうか?

1、
for(int i=0; i<1000; i++)
{
Datetime dt = new Datetime(2000,1,1,10,2,3);
}

2、
Datetime dt;
for(int i=0; i<1000; i++)
{
dt = new Datetime(2000,1,1,10,2,3);
}

引用返信 編集キー/
■54219 / inTopicNo.2)  Re[1]: インスタンス化する時は、どちらが良いのでしょうか?
□投稿者/ すなふきぬ (61回)-(2010/10/10(Sun) 03:14:50)
No54218 (まっさ さん) に返信
> この1,2のパターンの場合、結果的に何かかわるのでしょうか?

まず、結論から先に言うとアドレス等の微妙な違いはありますが、ほぼ同程度のMSILを吐きました。
異なっていた部分は、
1.変数dtの領域を確保する順番
2.変数dtの領域を確保した直後に呼び出されるコールされる関数。
3.for文中で変数dtに、新しいインスタンスを代入した直後にコールされる関数。

1のアドレスが微妙に異なるのは、forで使用しているint iの領域を先に確保しているかどうかの違いなので意識しないで良いかと思います。
2、3の関数についてはアドレスだけなのでメソッドなのか、APIなのか特定できてませんが、差があるとしたらここの部分のみでした。


> なんとなく1は無駄にメモリを消費しそうなイメージですが・・・

コンパイル段階で、変数のスコープは解決できるのでコンパイラが関数スコープの変数で確保したみたいなので、今回の場合は同じだけのメモリ領域(変数の格納領域を含め)を使用していました。

但し、今回のケースはコンパイラの最適化が行われた可能性もあるので、過信は禁物だと思います。

#コードの書き方やgoto, breakの有無で字句解析、有限オートマンの状態判定が変わる可能性があると言うことは、スコープ解決の段階でソースに忠実なスコープで領域を確保する可能性があるって事になるんでしょうか?あまりコンパイラには詳しくないので。。。
引用返信 編集キー/
■54220 / inTopicNo.3)  Re[1]: インスタンス化する時は、どちらが良いのでしょうか?
□投稿者/ shu (89回)-(2010/10/10(Sun) 07:41:08)
No54218 (まっさ さん) に返信
変数のスコープが変わるので、for内以外でdtを使用しないのであれば1、
dtをfor内以外でも使用するのであれば2が良いと思います。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -