none
GCについて RRS feed

  • 質問

  •  

    こんにちは。

     

    GCのことが良くわからないのですが、

    例えば、ある関数内で
    計算のために一時的にstruct hogeを使いたいときは、
    特にnewで生成しなくてもc++の一時変数みたいに
    hoge h;
    h.val0=1;
    h.val1=10;
    と初期化すれば使えますよね。

     

    ・このようにnewしないで作った変数はスタックにつくられ

     生存期間はcやc++のようにその関数を抜けた時点で消える=GCの対象にはならない
    ・newで生成した場合はヒープに作られ消去のタイミングはGC任せでありGCの対象になる
    ・よって一時的に使うだけならnewしないほうがパフォーマンスに与える負荷は少ない

     

    という理解でいいでしょうか?

    2008年12月10日 22:16

回答

  •  oreore さんからの引用

    計算のために一時的にstruct hogeを使いたいときは、
    特にnewで生成しなくてもc++の一時変数みたいに
    hoge h;
    h.val0=1;
    h.val1=10;
    と初期化すれば使えますよね。


    構造体(値型)のメモリ確保は基本的にスタックに行われると考えていていいと思います。
    但し、文法上ではC#では構造体/classに関わらずnewによる初期化が必要です。上記例だとコンパイルエラー‥‥のはず。
    (うそ。new無しでもいけるっぽい?)

    C++のようにnewかどうかでメモリ確保方法が変わるのではなく、参照型(クラス)か値型(構造体)かで確保方法が
    変わるのだと理解しておくといいと思います。

    結論を読み替えると‥‥
    ・値型(構造体)の変数は、基本的にスタックにつくられ
     その場合の生存期間はcやc++のようにその関数を抜けた時点で消える=GCの対象にはならない
    ・値型は状況により自動的に参照型<>値型に相互変換される。参照型に変換された値型はGC対象。
    ・参照型の変数はヒープに作られ消去のタイミングはGC任せでありGCの対象になる
    ・よって一時的に使うだけなら値型のほうがパフォーマンスに与える負荷は少ない

    でしょうか?new云々はまったく関係が無いことに注意してください。
    値型の方がパフォーマンスが高いというのは実際のプログラムの組み方やVM実装に依存するため議論が分かれるところ
    かもしれませんが、通常の利用範囲においてはその通りだと思います。
    2008年12月11日 0:38
  • C/C++ と違って、ローカル変数がスタックに置かれるかヒープに置かれるかは型の種類に依存します。class == 参照型ならヒープに置かれ、struct == 値型ならスタックに置かれます。new の有無は関係ありません。宣言時に既に実体が存在するため、コンストラクタ呼び出しはただのメソッド呼び出しと考えても間違いではないでしょう。
    2008年12月11日 0:43

すべての返信

  •  oreore さんからの引用

    計算のために一時的にstruct hogeを使いたいときは、
    特にnewで生成しなくてもc++の一時変数みたいに
    hoge h;
    h.val0=1;
    h.val1=10;
    と初期化すれば使えますよね。


    構造体(値型)のメモリ確保は基本的にスタックに行われると考えていていいと思います。
    但し、文法上ではC#では構造体/classに関わらずnewによる初期化が必要です。上記例だとコンパイルエラー‥‥のはず。
    (うそ。new無しでもいけるっぽい?)

    C++のようにnewかどうかでメモリ確保方法が変わるのではなく、参照型(クラス)か値型(構造体)かで確保方法が
    変わるのだと理解しておくといいと思います。

    結論を読み替えると‥‥
    ・値型(構造体)の変数は、基本的にスタックにつくられ
     その場合の生存期間はcやc++のようにその関数を抜けた時点で消える=GCの対象にはならない
    ・値型は状況により自動的に参照型<>値型に相互変換される。参照型に変換された値型はGC対象。
    ・参照型の変数はヒープに作られ消去のタイミングはGC任せでありGCの対象になる
    ・よって一時的に使うだけなら値型のほうがパフォーマンスに与える負荷は少ない

    でしょうか?new云々はまったく関係が無いことに注意してください。
    値型の方がパフォーマンスが高いというのは実際のプログラムの組み方やVM実装に依存するため議論が分かれるところ
    かもしれませんが、通常の利用範囲においてはその通りだと思います。
    2008年12月11日 0:38
  • C/C++ と違って、ローカル変数がスタックに置かれるかヒープに置かれるかは型の種類に依存します。class == 参照型ならヒープに置かれ、struct == 値型ならスタックに置かれます。new の有無は関係ありません。宣言時に既に実体が存在するため、コンストラクタ呼び出しはただのメソッド呼び出しと考えても間違いではないでしょう。
    2008年12月11日 0:43
  • なるほど、よくわかりました。

    ご返信ありがとうございました。
    2008年12月12日 1:48
  • GC には影響しないことに納得されたので蛇足になりますが、構造体でコンストラクタの呼び出しを行った際の実際の処理内容は、[デバッグ] → [ウィンドウ] → [逆アセンブル] でも確認できます。

    メモリ領域がゼロで初期化されるだけのようなので、パフォーマンス上のコストは特殊な状況でない限り無視して良さそうですね。

    2008年12月12日 9:22