从内存中的另一个类继承的类是否比不使用继承的类继承?

时间:2012-04-18 13:19:07

标签: c# memory inheritance object clr

想象一下,我有两个类,class1和class2。

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数组是否会更大,因为class1还包含与baseClass有关的某种元数据?否则它们的属性是相同的,所以在技术上它们应该是相同的。

3 个答案:

答案 0 :(得分:4)

给定两个引用类型数组,即:

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

数组完全大小相同。数组的元素只是引用,并且引用总是相同的大小,无论它引用的对象如何。引用是32位运行时中的4个字节,以及64位运行时中的8个字节。

对于类实例,我希望它们的大小相同。类实例本身仅保存类的数据,以及包含对该类的类型的引用的少量其他数据。类实例本身并不“知道”它是派生类。该信息由类型保存。

因此,Class1类型信息可能略大于Class2的类型信息,但这两个类的实例将会占用相同数量的记忆。

总而言之,使用继承自Class1的{​​{1}},除了使用baseClass之外,还会花费少量字节,因为您有两个类的类型信息。但它实际上只是几个字节 - 无论是类元数据的开销。对于每个类实例,它不会花费任何额外费用。

答案 1 :(得分: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
}

答案 2 :(得分:0)

除非您使用虚拟方法,否则大小将相同。

使用虚方法时,对于该类中的虚拟表指针,将有一个字节开销。