c# - C# 与 C++ 中虚拟调用的速度

标签 c# c++ polymorphism virtual

我似乎记得在某处读到过,相对而言,C# 中虚拟调用的成本不如 C++ 中高。这是真的?如果是这样 - 为什么?

最佳答案

C# 虚拟调用必须检查“this”是否为空,而 C++ 虚拟调用则不需要。所以我一般看不出为什么 C# 虚拟调用会更快。在特殊情况下,C# 编译器(或 JIT 编译器)可能能够比 C++ 编译器更好地内联虚拟调用,因为 C# 编译器可以访问更好的类型信息。在 C++ 中,调用方法指令有时可能会更慢,因为 C# JIT 可能会使用更快的指令,它只处理一个小的偏移量,因为它对运行时内存布局和处理器模型了解得更多一个 C++ 编译器。

然而,我们在这里最多谈论的是少数处理器指令。在现代超标量处理器上,“空检查”指令很可能与“调用方法”同时运行,因此不需要时间。

如果在循环中进行调用,所有处理器指令也很可能已经在一级缓存中。但是数据不太可能是缓存,现在从主内存读取数据值的成本与从 1 级缓存运行 100 条指令的成本相同。因此,不幸的是,在实际应用中,虚拟调用的成本甚至在极少数地方是可以测量的。

C# 代码使用更多指令的事实当然会减少缓存中可容纳的代码量,其效果无法预测。

(如果 C++ 类使用多重继承,那么成本会更高,因为必须修补“this”指针。类似地,C# 中的接口(interface)添加了另一层重定向。)

关于c# - C# 与 C++ 中虚拟调用的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676915/

相关文章:

c++ - 多态性和指向数组的指针

java - 方法重载是一种多态性吗?

c# - 如何在 C# 中执行 "static overloaded const"?

c# - 从 ViewModel 向 View 发送命令是否违反了 MVVM?

c# - 使用 protobuf-net 进行条件序列化

c# - 如何在 C# .NET 中像 Java 代码一样加密

c++ - 不完整类型的无效使用 'DIR'

c++ - Windows 7 以编程方式登录

c# - 以代码形式查看 XSD

c++ - 减少 C++ 编译时间的产品?