Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基类中的非虚拟C#方法是否仍会产生vtable开销?_C#_Performance_Static_Instance_Vtable - Fatal编程技术网

基类中的非虚拟C#方法是否仍会产生vtable开销?

基类中的非虚拟C#方法是否仍会产生vtable开销?,c#,performance,static,instance,vtable,C#,Performance,Static,Instance,Vtable,考虑到C#是为了获得最高性能而编写的,我们有两种方法可以使用基类方法(注意:这里我们讨论的是无状态类,没有字段,只有方法): 实例类A为类B的继承/扩展提供了基础—通常的模式 带有静态方法(纯函数)的静态类A由“extender”类B静态调用 我喜欢A选项,因为它使关系更清晰。我想知道的是,如果所有这些基类方法都是非虚拟的,即在基类A中它们已经不能被重写,那么是否存在vtable调用?显然,“非虚拟”意味着没有,但如果有任何开销,我想知道。根据@HansPassant(非常感谢) 即使是对实

考虑到C#是为了获得最高性能而编写的,我们有两种方法可以使用基类方法(注意:这里我们讨论的是无状态类,没有字段,只有方法):

  • 实例类A为类B的继承/扩展提供了基础—通常的模式
  • 带有静态方法(纯函数)的静态类A由“extender”类B静态调用
我喜欢A选项,因为它使关系更清晰。我想知道的是,如果所有这些基类方法都是非虚拟的,即在基类A中它们已经不能被重写,那么是否存在vtable调用?显然,“非虚拟”意味着没有,但如果有任何开销,我想知道。

根据@HansPassant(非常感谢)


即使是对实例方法的非虚拟调用也使用精确的 相当于虚拟呼叫。为了一个非常好的机会放弃一点表演 保证,总是在调用站点引发NullReferenceException。 当这个值为空时诊断NRE是相当难看的

只有对静态方法的调用是非虚拟的。顺便说一句,这包括扩展方法


callvirt
可以任意使用。@CodeCaster您能提供一个参考吗?这就是C#和CLR的工作方式。每种类型都有一个方法表,不管这些方法是虚拟的还是非虚拟的。即使是对实例方法的非虚拟调用也会使用与虚拟调用完全等效的方法。为了得到一个非常好的保证而放弃一点性能,在调用站点总是会引发一个NullReferenceException。当这个值为空时诊断NRE是相当难看的。只有对静态方法的调用是非虚拟的。顺便说一句,这包括扩展方法。