想象一下,我有两个类,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有关的某种元数据?否则它们的属性是相同的,所以在技术上它们应该是相同的。
答案 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)
除非您使用虚拟方法,否则大小将相同。
使用虚方法时,对于该类中的虚拟表指针,将有一个字节开销。