原則として:
1. C++ のクラス型は値型です。つまり、クラス オブジェクトがインスタンス化されると、メモリがスタック上に割り当てられます。
このようにクラス型を次のように定義すると、
クラスA
{
公共:
int i;
ああ、
}
A のオブジェクトをインスタンス化するときに、A はメンバーの型に基づいてそのようなオブジェクトが占めるメモリ領域を計算する必要があるため、無限ループに陥ります (データ メンバーは型とメンバーのコードに基づいて決定されます)。関数は exe に保存されます。メモリにマップするには、ポインタを使用してメモリ アドレスを指し、クラスの説明情報を追加するだけですが、オブジェクトが見つかった場合、sizeof は説明情報のこの部分のメモリ使用量を表示しません。 a は独自の型であり、a が使用するデータを計算します。a は型 A であるため、繰り返します。
したがって、C++では
独自のタイプのポインターを含めることができます (リンク リストでよく使用されます)。
クラスA
{
公共:
int i;
ア○パ。
}
ポインタ変数が占めるメモリ空間は、長さのマシンワード数によって簡単に判断できます。
2. C# のクラス型は参照型であり、本質的にはポインターです。
したがって、C# のすべてのクラス オブジェクト自体は 4 バイト (32 ビット マシン) であり、ヒープ メモリ空間を指すメモリ アドレスが含まれています。
クラスA
{
パブリック int i;
パブリック A a;
}
オブジェクト = new A();
オブジェクト自体は 4 バイトのメモリを占有し、ヒープ メモリ アドレスを格納します。このメモリのサイズは 8 バイトです (int 4 バイト、 a も 4 バイト)。 メンバ a がインスタンス化されるとき、 a の内容は null ではありません。 8 バイトのメモリ空間を指す別のアドレスをヒープ メモリに保存します。
A のオブジェクトが占めるメモリ領域 (32 ビット マシンでは 4 バイト、すべての C# クラス オブジェクトが 4 バイトを占有する) を決定できるため、次のように定義できます。
-