java接口是如何在内部实现的?(vtables?)
C++具有多重继承。在程序集级别实现多重继承可能相当复杂,但在通常情况下如何实现这一点上有很多好的在线方法(vtables、指针修正、thunks等) Java没有多个实现继承,但它有多个接口继承,所以我认为一个简单的实现,每个类只有一个vtable,不能实现这一点。java如何在内部实现接口 <>我意识到,与C++不同,java是JIT编译的,所以不同的代码可以不同的优化,不同的JVM可能会做不同的事情。那么,许多JVM是否遵循一些通用的策略,或者是否有人知道在特定JVM中的实现 此外,JVM经常进行设备化和内联方法调用,在这种情况下,根本不涉及vtables或等效项,因此询问实现虚拟/接口方法调用的实际程序集序列可能没有意义,但是我假设大多数JVM仍然保留一些类的通用表示,如果它们不能将所有东西都虚拟化,那么可以使用它们。这个假设是错误的吗?这个表示是否像C++ VTABLE那样看起来?如果是这样,接口是否有单独的vtables?这些vtables如何与类vtables链接?如果这样,对象实例可以有多个VTABLE指针(类/接口VTABLE),像C++中的对象实例一样吗?对同一对象的类类型和接口类型的引用总是具有相同的二进制值,或者这些不同之处可能与在C++中需要指针固定的情况不同吗?p> (供参考:询问有关CLR的一些类似问题,在中似乎有一个很好的解释,尽管这可能已经过时了。我还没有找到与Java类似的东西。) 编辑:java接口是如何在内部实现的?(vtables?),java,interface,internals,vtable,language-implementation,Java,Interface,Internals,Vtable,Language Implementation,C++具有多重继承。在程序集级别实现多重继承可能相当复杂,但在通常情况下如何实现这一点上有很多好的在线方法(vtables、指针修正、thunks等) Java没有多个实现继承,但它有多个接口继承,所以我认为一个简单的实现,每个类只有一个vtable,不能实现这一点。java如何在内部实现接口 我意识到,与C++不同,java是JIT编译的,所以不同的代码可以不同的优化,不同的JVM可能会做不同的事情。那么,许多JVM是否遵循一些通用的策略,或者是否有人知道在特定JVM中的实现 此外,JVM经常
- 我的意思是“implements”,意思是“GCC编译器如何实现整数加法/函数调用/etc”,而不是“Java类ArrayList实现列表接口”李>
- 我知道这在JVM字节码级别是如何工作的,我想知道的是,在加载类文件和编译字节码之后,JVM生成了什么样的代码和数据结构李>
编辑:提供了有关vtable和itable存根的更多详细信息。在多态情况下,它仍然将内联缓存版本放入调用站点。然而,代码实际上是一个存根,它在vtable或itable中执行查找。每个vtable偏移量(0、1、2,…)有一个vtable存根。在给定偏移量处查找itable(如果找到)之前,在itable数组上添加线性搜索。您提到了接口继承和实现继承。实现继承很困难,因为您需要定义搜索顺序。接口继承要简单得多。您只需要有一个包含所有需要实现的方法签名的映射。不需要搜索顺序(因为没有附加任何实现)。那里没有秩序。那些VirtualCalls和InterfaceCall上的热点Wiki页面似乎就是我要找的。但是,我仍然需要四处阅读。维基已经被移动到oracle维基,已经被冻结,我认为这就是可更新信息的最终目的。