gpt4 book ai didi

java - java接口(interface)是如何在内部实现的? (虚拟表?)

转载 作者:IT老高 更新时间:2023-10-28 20:48:32 32 4
gpt4 key购买 nike

C++ 有多重继承。汇编级别的多重继承的实现可能相当复杂,但是有很好的descriptions在线了解这通常是如何完成的(vtables、指针修复、thunk 等)。

Java 没有多重实现继承,但它确实有多重接口(interface)继承,所以我不认为每个类只有一个 vtable 的直接实现可以实现这一点。 java内部是如何实现接口(interface)的?

我意识到,与 C++ 不同,Java 是 Jit 编译的,因此不同的代码可能会以不同的方式进行优化,不同的 JVM 可能会做不同的事情。那么,是否有许多 JVM 遵循的一些通用策略,或者是否有人知道特定 JVM 中的实现?

JVM 也经常去虚拟化和内联方法调用,在这种情况下根本不涉及 vtable 或等效项,因此询问实现虚拟/接口(interface)方法调用的实际汇编序列可能没有意义,但我假设大多数 JVM如果它们无法对所有内容进行虚拟化,仍然保留某种类的一般表示以供使用。这个假设是错误的吗?这种表示形式看起来像 C++ vtable 吗?如果是这样,接口(interface)是否有单独的 vtables,它们如何与类 vtables 链接?如果是这样,对象实例是否可以像 C++ 中的对象实例一样具有多个 vtable 指针(指向类/接口(interface) vtable)?对同一对象的类类型和接口(interface)类型的引用是否总是具有相同的二进制值,或者它们是否可以像在需要指针修复的 C++ 中那样不同?

(供引用:this question 询问有关 CLR 的类似问题,this msdn article 中似乎有一个很好的解释,尽管现在可能已经过时了。我无法为 Java 找到类似的东西。 )

编辑:

  • 我的意思是“GCC 编译器如何实现整数加法/函数调用/等”的意义上的“实现”,而不是“Java 类 ArrayList 实现 List 接口(interface)”的意义上。
  • 我知道这在 JVM 字节码级别是如何工作的,我想知道的是 JVM 在完成加载类文件和编译字节码后会生成什么样的代码和数据结构。

最佳答案

HotSpot JVM 的关键特性是 inline caching .这实际上并不意味着目标方法是内联的,而是意味着假设被放入 JIT 代码中,以后对虚拟或接口(interface)方法的每次调用都将针对相同的实现(即调用站点是单态的)。在这种情况下,一个check 被编译到机器代码中,假设是否真的成立(即是否目标对象的类型与上次相同),然后转移控制权直接到目标方法 - 根本不涉及虚拟表。如果断言失败,可能会尝试将其转换为超态调用站点(即具有多种可能的类型);如果这也失败(或者如果它是第一次调用),则使用 vtables(用于虚拟方法)和 itables(用于接口(interface))执行常规的冗长查找。

编辑:Hotspot Wiki有关 vtable 和 itable stub 的更多详细信息。在多态情况下,它仍然将内联缓存版本放入调用站点。然而,代码实际上是一个在 vtable 或 itable 中执行查找的 stub 。每个 vtable 偏移 (0, 1, 2, ...) 都有一个 vtable stub 。 Interface calls在给定偏移量处查看 itable(如果找到)之前,在 itable 数组上添加线性搜索。

关于java - java接口(interface)是如何在内部实现的? (虚拟表?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423968/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com