私は次のようなクラスを持っています:
public class A
{
int i;
}
次のようにクラスのオブジェクトを作成しているとき:
A obj=new A();
オブジェクトがヒープに割り当てられていることがわかります。これで、クラスは整数変数を取得しました。メンバー変数「i」が割り当てられている場所 (スタックまたはヒープ)?
私は次のようなクラスを持っています:
public class A
{
int i;
}
次のようにクラスのオブジェクトを作成しているとき:
A obj=new A();
オブジェクトがヒープに割り当てられていることがわかります。これで、クラスは整数変数を取得しました。メンバー変数「i」が割り当てられている場所 (スタックまたはヒープ)?
i
はフィールドであるため、インスタンス自体の一部です。インスタンスはヒープ上にあり、i
...で構成さi
れているため、ヒープ上にあります。
struct
インスタンス (値) はほぼどこにでもある可能性があるため、これは型にとってより興味深いものになりi
ます。あなたが言えるのは「インスタンス内」だけです。
メンバー変数「i」が割り当てられている場所 (スタックまたはヒープ)?
それはヒープ上にあり、オブジェクトのメモリの一部です。(変数がオブジェクトのデータの一部として終わらない場合、オブジェクトのデータは何で構成されると予想されますか?)
もちろん、Eric Lippert が指摘するように、スタックは実装の詳細です (パート 1 ; [part two][2]
)。通常は、あまり気にする必要はありません。実際には、ローカル変数がヒープに割り当てられ始めるケースがますます増えています。
逆が真であるという証拠はあまり見たことがありませんが、将来の CLR ではエスケープ解析を使用して、特定のオブジェクトをヒープに割り当てる必要がなかったことを証明し、代わりにスタックに割り当てることが可能になるかもしれません。(一部の JVM はこれを行っていると思います。)
すべてのクラス メンバーは、継続的なメモリ割り当てでヒープに入ります。メソッド内のすべての変数 (ローカル変数) はスタックに割り当てられます。