在维基百科中偶然发现了这一点:
Java可以比C ++更快地访问派生实例方法 由于C ++的额外虚拟表查找而导出的虚拟方法。 但是,C ++中的非虚方法不会受到V-Table的影响 性能瓶颈,因此表现出类似的性能 Java。
这是对的吗?据我所知,ALL调用在Java中是虚拟的,仍然依赖于虚拟表,因此我的常见逻辑表明Java调用不可能比虚拟C ++调用更快。
我是否误导或文章错了?无论如何 - 在运行时解析调用的方法是否比虚拟表更快?
答案 0 :(得分:7)
它可能与JIT编译执行的优化有关。在某些情况下,我可以想象JVM会检测到某个(虚拟)调用总是引用某个实现并且不需要查找。
OTOH,C ++编译器也可能推断出在某些情况下不需要查找并产生同样好的代码。此外,C ++不需要虚函数,因此Java提供了另一种选择。
也就是说,如果你需要virtual
在C ++中提供的功能,那么我认为通常没有更好的选择。如果您关心性能,请注意virtual
通常确实有成本,并且只应在需要时使用。
一般来说,我发现你所引用的陈述没有帮助和误导(当然不是你的错)。
答案 1 :(得分:3)
为该引用阅读source:
因为编译器知道实际加载和存在哪些类 调用,它知道哪些方法可以去虚拟化和内联。 (值得注意的是,现代java编译器也知道如何“uncompile” 在之后加载重写方法的情况下的内联调用 JIT编译发生了。)
虽然我不明白为什么C ++编译器不能这样做。