[c#] 構造体は常にスタックに割り当てられているか、時にはヒープに割り当てられていますか?


Answers

構造体はintと似ています。 ローカルintを持つ場合は、一般にスタックに格納されます。intのリストがある場合は、ヒープ上のリストの内部配列に直接格納されます。 構造体も同じように動作します。

Question

私はC#では、構造体の要素がスタックに割り当てられているため、作成されたメソッドから戻るときに消えてしまうという印象を受けました。 しかし、構造体の値をリストに入れて返すとどうなりますか? 要素は生き残る。 構造体インスタンスが時々ヒープに割り当てられますか?

internal struct Stru
{
  public int i;
}

internal class StruTry
{
  public List<Stru> Get(int max)
  {
    var l = new List<Stru>();
    for (int i = 0; i < max; i++)
      l.Add(new Stru {i=i});

    return l;
  }
}

コード印刷0,1,2

[Test]
public void T()
{
  var ll = new StruTry().Get(3);
  foreach (var stru in ll)
    Console.WriteLine("* "+ stru.i);
}



すべての型をいつかヒープに割り当てることができます。 それ以外に、ヒープ/スタックはCLRの実装の詳細であり、C#の仕様ではないので、あなたはそのようなことに頼るべきではありません。 この件に関する良いブログ記事はこちらをご覧ください。




struct型の格納場所(変数、フィールド、パラメータ、配列スロットなど)は、構造体のパブリックフィールドとプライベートフィールドを保持します。 その記憶場所がスタック上にある場合、構造体のフィールドはスタック上にあります。 それが別のクラスまたは構造体内にある場合、構造体のフィールドは他のクラスまたは構造体インスタンスの一部として格納されます

クラス型の格納場所は、(1)参照を保持する格納場所から完全に離れた場所に格納されている完全なクラスオブジェクトへの参照、または(2)格納場所がフィールドであるクラスオブジェクトへの参照を保持します。




Links