3

class1 と class2 の 2 つのクラスがあるとします。

Class1 は baseClass から継承します。これは次のようになります。

baseClass
{
private Int64 one;
protected Int64 two;
public Int64 three;
}

そしてclass1はこのようになります

Class1 : baseClass
{
private Int64 four;
protected Int64 five;
public Int64 six;
}

class2 は次のようになります。

Class2
{
private Int64 one;
protected Int64 two;
public Int64 three;
private Int64 four;
protected Int64 five;
public Int64 six;
}

各クラスの 10k の配列を作成するとしたら、どちらが大きいでしょうか? class1 には baseClass に関係する何らかのメタデータも含まれるため、class1 配列は大きくなりますか? それ以外の場合、それらのプロパティは同じであるため、技術的には同じである必要があります。

4

3 に答える 3

4

参照型の 2 つの配列があるとします。つまり、次のようになります。

Class1[] a1 = new Class1[10000];
Class2[] a2 = new Class2[10000];

配列はまったく同じサイズになります。配列の要素は単なる参照であり、参照先のオブジェクトに関係なく、参照は常に同じサイズです。参照は、32 ビット ランタイムでは 4 バイト、64 ビット ランタイムでは 8 バイトです。

クラス インスタンスに関しては、サイズも同じであることが期待されます。クラス インスタンス自体は、クラスのデータと、そのクラスの型への参照を含むその他の少量のデータのみを保持します。クラス インスタンス自体は、それが派生クラスであることを「認識」していません。その情報は型によって保持されます。

そのため、 の情報はの型情報Class1よりもわずかに大きくなる可能性がありClass2ますが、これら 2 つのクラスのインスタンスは同じ量のメモリを占有します。

結局のところClass1、 を継承する を使用すると、 を使用baseClassするよりも数バイト多くコストがかかりますClass2。これは、2 つのクラスの型情報があるためです。しかし実際には、クラス メタデータのオーバーヘッドがどうであれ、ほんの数バイト増えるだけです。クラスインスタンスごとに追加の費用はかかりません。

于 2012-04-18T13:46:30.863 に答える
0

仮想メソッドを使用していない限り、サイズは同じになります。

仮想メソッドを使用すると、そのクラスの仮想テーブル ポインターに対してバイトのオーバーヘッドが発生します。

于 2012-04-18T13:58:16.590 に答える
0

これは、相互に相対的なサイズの概要のみを示していることに注意してください。私の知る限り、実行時のサイズを直接知る方法はありません。

baseClass bc = new baseClass();


Class1 class1 = new Class1();
Class2 class2 = new Class2();

long bcSize = 0;
long class1Size = 0;
long class2Size = 0;

using (Stream s = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, bc);
    bcSize = s.Length; //223
}

using (Stream s = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, class1);
    class1Size = s.Length; //298
}

using (Stream s = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, class2);
    class2Size = s.Length; //264
}
于 2012-04-18T13:32:42.277 に答える