C#类大小计算

Iva*_* G. 4 .net c# architecture

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

Sam*_*ell 7

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

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

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

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

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

  • 对于具有单个类型参数的泛型方法,对于每种值类型存在一个副本,通用类型将实例化,并且对于所有引用类型一起存在一次(如果未在任何引用类型上实例化,则为零).为多个类型参数的每个组合展开... (2认同)