一个类继承自另一个类比不使用继承的类更大的内存吗?

想象一下,我有两个类,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有关的元数据吗?否则它们的属性是相同的,因此从技术上讲它们应该相同.

解决方法:

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

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

数组的大小将完全相同.数组的元素只是引用,引用的大小始终相同,无论引用对象是什么.引用在32位运行时中为4字节,在64位运行时中为8字节.

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

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

综上所述,使用继承自baseClass的Class1会比使用Class2花费更多的字节,因为您拥有两个类的类型信息.但这实际上只是增加了几个字节-无论类元数据的开销是多少.每个类实例不会花费您任何额外的费用.

上一篇:CLR中的castclass操作码的目的是什么?


下一篇:哪些现有的CLR主机不提供托管线程和非托管线程之间的一对一映射?