2010-01-06 49 views
3

我想知道实例化类时,C#类的实际代码是否在RAM中加载?加载在RAM中的C#类代码?

因此,例如,如果我有2类A类,B,其中A类具有10000行的代码而只是1字段,一个int。而B类有10行代码,也有1个字段也是int。如果我实例化类A,由于它的代码行,它会比类B占用更多的RAM吗?

补充质询,如果几行代码在内存与类加载一起,他们将被加载的类的每个实例?或只是一次为所有的情况?

在此先感谢。

回答

9

在桌面框架中,我认为方法是逐个方法的基础上进行的。我不知道在第一次加载类时,IL的类是否完全加载到RAM中,或者它们是否只是内存映射到程序集文件。

无论采用哪种方式,您都可以获得所有实例的单个副本 - 至少对于非泛型类型。对于泛型类型(和方法),它变得稍微复杂 - 有一个为一个JIT表示所有引用类型类型的参数,以及一个用于每个值类型类型参数。所以List<string>List<Stream>共享本地代码,但List<int>List<Guid>不。 (对于具有多个泛型类型参数的类型,适当地进行外推)。对于同一构造类型的所有实例,您仍然只获得一个副本 - 但对象不会附带它们自己的本机代码副本。

+0

这是有趣的...没有CLR的内幕本书涵盖这种东西。我不记得在语言规范中阅读它。 – 2010-01-06 08:15:33

+0

好的thx为您的快速回复。所以,如果你创建了一个类的很多实例,如果你减少它的代码行,你不会获得任何显着的好处(内存明智)。 – 2010-01-06 08:21:12

+0

@Andrew:当然不是语言规范的一部分,也不应该这样。 CLR通过C#涵盖了这一点。 @ Spi1988:是的,大多数程序将使用比代码,IME更多的内存数据。 – 2010-01-06 08:40:58

4

类型A的一个实例将采取准确的存储器中的相同量的B型的存储器由一个类型的一个实例中所用的量为等领域的直接结果,其含有所以如果两种类型的含有相同的字段,那么这两种类型的实例将包含相同数量的内存。当然,如果你有可变长度的字段,比如字符串,数组,集合等,那么你必须考虑到这一点,但是如果字段设置为每个类型的相同值,那么将使用相同数量的内存。

在一个应用程序域,包含用于每个类型的方法的指令的代码将仅加载一次,而不是用于所述类型的每个实例。正如Jon所说,重要的是要记住每个封闭的泛型类型(包含所有类型参数)是一个单独的运行时类型。

顺便说一句,这并不重要你的类型有多少行源代码包含,但多少IL这个源代码编译成。但是,如果一个类型有10行源代码,另一个类型有10,000个,那么后一类的IL很有可能会更大。您可以使用诸如.NET Reflector之类的工具来检查IL。