C#类大小计算

时间:2009-08-24 14:53:36

标签: c# .net architecture

在C#(.NET)中,确切的方法(虚拟,静态,非虚拟)如何影响类的大小?

2 个答案:

答案 0 :(得分:7)

每个方法都占用内存来保存其字节码。代码对于每个方法都存在一次,而不是每个实例都存在一次。

添加和删除实例方法(虚拟或非虚拟)不会更改已分配对象的大小。这与C ++不同,添加虚方法有时会增加分配对象的大小。与C ++一样,静态方法不会改变分配对象的大小。

¹对于通用方法,每个类型的实例都存在一个副本。

编辑:在回复评论时,我会详细介绍。

@Richard:可能是也可能不是(可能会有所不同)。只需要一个IL字节代码的副本。开放构造方法和闭合构造方法需要一个方法描述符块,加上仍包含泛型类型参数的构造实例的描述符(泛型类型定义的泛型参数化基类型中具有泛型参数的方法)。通常,每个封闭的构造实例都会保留一个本机代码副本,这个实例是一个值类型加一个零或多个引用类型,但可能为零(不是JIT'd /刚解释)或两个或更多(基线和优化)编译器,其中一个或多个callstack没有离开基线版本,因为该方法是使用优化JIT重新编译的)。 再次编辑:您的正确之处在于,通用参数约束只允许其实例化的所有引用类型的本机代码的一个副本。

答案 1 :(得分:1)

每个实例的大小取决于类的字段,而不是方法。根据实现细节,实现接口可能占用实例中的空间(每个接口可能有一个指针大小的插槽),但不保证这样做。

但是,您很难找到实施定义行为的“官方参考”,因为它可能会在未来发生变化。