3

想象一下,我有两个班级,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 相关的元数据?否则它们的属性是相同的,所以从技术上讲它们应该是相同的。

4

3 回答 3

4

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

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

数组的大小完全相同。数组的元素只是引用,并且无论引用的对象是什么,引用总是相同的大小。引用在 32 位运行时为 4 个字节,在 64 位运行时为 8 个字节。

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

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

总而言之Class1,继承自baseClass的 using 将比 using 多花费几个字节Class2,因为您有两个类的类型信息。但它实际上只是多了几个字节——无论类元数据的开销是多少。每个类实例都不会花费您任何额外费用。

于 2012-04-18T13:46:30.863 回答
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 回答
0

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

使用虚拟方法时,该类中的虚拟表指针将产生字节开销。

于 2012-04-18T13:58:16.590 回答