c++;vs java 我经常看到人们抱怨C++中的虚拟函数成本。但同样的人也不会对java中的运行时多态性说任何负面的话 如果我必须在C++中开发一个运行时,它在C++中开发应用程序,我将采用以下方法: 具有虚拟方法的基类,这些方法表示“抽象”应用程序。这是应用程序的运行时视图。应用程序开发人员继承基类并将其应用程序编译成可动态加载的共享库 具有虚拟方法的基类,虚拟方法表示运行时的“服务”。运行时实现这些服务。应用程序通过这些接口类使用这些服务。运行时加载应用程序动态库,并使用其服务的实现对象初始化应用程序

c++;vs java 我经常看到人们抱怨C++中的虚拟函数成本。但同样的人也不会对java中的运行时多态性说任何负面的话 如果我必须在C++中开发一个运行时,它在C++中开发应用程序,我将采用以下方法: 具有虚拟方法的基类,这些方法表示“抽象”应用程序。这是应用程序的运行时视图。应用程序开发人员继承基类并将其应用程序编译成可动态加载的共享库 具有虚拟方法的基类,虚拟方法表示运行时的“服务”。运行时实现这些服务。应用程序通过这些接口类使用这些服务。运行时加载应用程序动态库,并使用其服务的实现对象初始化应用程序,java,c++,polymorphism,Java,C++,Polymorphism,现在,应用程序和运行时都有各自的句柄,并使用虚拟方法调用相互调用。是的,这是有成本的,但这也让我们将应用程序与运行时分离。如果没有虚拟方法,应用程序将始终与运行时具有链接时间依赖关系 现在考虑java中的一个类似的例子。Java也有需要实现的接口,并且对于所涉及的运行时多态性必须有类似的成本 我对java运行时多态性的理解正确吗 P>如果java也有成本,为什么C++总是会有“OH有虚拟函数成本,而使用虚函数来解耦应用程序的部分是强的,当然是坏的< /强”的愤怒评论。如果是Java,这些人会去

现在,应用程序和运行时都有各自的句柄,并使用虚拟方法调用相互调用。是的,这是有成本的,但这也让我们将应用程序与运行时分离。如果没有虚拟方法,应用程序将始终与运行时具有链接时间依赖关系

现在考虑java中的一个类似的例子。Java也有需要实现的接口,并且对于所涉及的运行时多态性必须有类似的成本

我对java运行时多态性的理解正确吗

<> P>如果java也有成本,为什么C++总是会有“OH有虚拟函数成本,而使用虚函数来解耦应用程序的部分是强的,当然是坏的< /强”的愤怒评论。如果是Java,这些人会去哪里?他们什么也没说


我的问题是如何处理这些评论?对于C++有什么合理的论点?

< p>我担心在这里写一个答案是徒劳的,因为这里必须有答案。p> <> P>不太“语言的WAR”,我认为使用java的人不一定非常关注C++程序员的性能,这可能反映了“哦,我们必须担心开销”的概念差异的一部分。p> 虚拟函数和非虚拟函数[1]之间肯定存在一些开销,非虚拟函数有时可以内联在虚拟版本无法内联的地方。但是考虑到其他的选择(使用switch或if语句来决定做什么)也很少是好的,并且有一点好的设计(不要设计调用虚拟函数将两个整数相加的函数,如果它将在一个紧循环中被调用——因为开销相当大——使用一个知道有数百或数千个整数要相加的函数——当然,如果可能的话)


[1] 开销包括间接读取
指针以查找vtable,然后在偏移量X处调用函数。主要开销往往是“更多寄存器”正在使用,这可能会对代码的效率产生负面影响。

我担心在这里写答案将是徒劳的,因为这里肯定已经有答案了

<> P>不太“语言的WAR”,我认为使用java的人不一定非常关注C++程序员的性能,这可能反映了“哦,我们必须担心开销”的概念差异的一部分。 虚拟函数和非虚拟函数[1]之间肯定存在一定的开销,非虚拟函数有时可以在虚拟版本无法内联的地方内联。但是,考虑到其他选择(使用switch或if语句来决定要做什么)也很少是好的,而且设计也有点好(不要设计调用虚拟函数将两个整数相加的函数,如果它将在一个紧循环中被调用——因为开销相当大——使用一个知道有数百或数千个整数要相加的函数——当然,如果可能的话)


[1] 开销包括间接读取
指针以查找vtable,然后在偏移量X处调用函数。主要开销往往是“更多寄存器”正在使用的,这可能会对代码的效率产生负面影响。

< P>使用虚拟方法的C++和java的主要区别是java开发者没有选择,因此java开发者在这种情况下不考虑性能的影响。 Java虚拟机也是为处理虚拟调用而设计的。这对性能有一定的影响,但您无法测量它,因为您没有其他方法。此外,较新的虚拟机还可以在运行时内联虚拟方法

在C++中,你有一段历史,C++来自C,早期没有动态链接,在这个时候添加了动态链接,这个链接过程必须以兼容的方式进行,然后添加虚拟函数,使之与之兼容,也就是第一个C++编译器只不过是C的预处理器。虚拟函数必须映射到现有的C结构


< C++ > C++ java语言中的虚拟函数的性能含义是基于历史的主要。

在使用虚拟方法时C++和java的主要区别是java开发者没有选择,因此Java开发者不考虑这种情况下的性能含义。 Java虚拟机也是为处理虚拟调用而设计的。这对性能有一定的影响,但您无法测量它,因为您没有其他方法。此外,较新的虚拟机还可以在运行时内联虚拟方法

在C++中,你有一段历史。C++来自C,早期没有动态链接。在时间上添加动态链接,这个链接过程必须在兼容中完成。