JVM如何处理多态性及其优化
how does the jvm handle polymorphism and its optimization
我有一个接口I和一个方法m,以及两个行为不同的实现类A和B。
A 和 B 的对象仅对其值和引用类型使用内存,而不对其方法使用内存。存储在类型 I 的变量中的 A 对象与引用(指针大小开销(加上对象大小一起存储。现在调用方法 m。现在这位信息存储在哪里,必须调用来自类 A 的方法 m 而不是从类 B 调用?
这个问题也让我对C++虚拟方法唠叨。
interface I { void m(); }
class A implements I { void m(){println("a");} }
class B implements I { void m(){println("b");} }
在C++中,每个对象通常包含一个指向函数地址表(vtable(的隐藏指针(vptr(。 每个类有一个 vtable,包含其虚函数实现的地址。 请参阅 http://en.wikipedia.org/wiki/Virtual_method_table。
我想Java以类似的方式实现事物(尽管我没有研究过(。
在实际执行代码(JIT(中,如果Hotspot JVM可以确定它是哪一个,至少它有时可以直接调用正确的方法(有效地去虚拟化它(。由于它还处理类加载,因此类层次结构是已知的,因此如果周围没有B的实例,则可以确定它是A,例如(单态(。如果以后创建了 B 的实例,它可以取消优化并仍然进行一些优化(只有两种选择仍然是双态的(。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- JVM如何处理多态性及其优化
- 比较优化的构建与切换情况和多态性