JLS 指出
从类型S到类型T的特定转换允许在编译时将类型S的表达式视为具有类型T的表达式。 在某些情况下,这需要在运行时执行相应的操作,以检查转换的有效性或将表达式的运行时值转换为适合于新T类型的形式。
The list of JVM instructions包含
检查广播
操作
检查对象是否为给定类型
Object o = new String();
String s =
(String)//what does the JVM do?
o;
由于描述指出checkcast会在失败时抛出 ClassCastException 并检查 objectref 是否可以转换为给定类型,所以我猜想这可能是执行的指令在运行时,如果我向下转换代码。
首先{1}:这个假设正确吗?
如果是这样的话:
Object o = (Object)//What do I do now?
new String();
{2}隐式或显式上传也是如此吗?
{3}在其他微优化的范围内,此指令会产生多少运行时间损失?
例如,与将包含对象引用的字段移至局部函数变量以缩短访问时间相比,或与其他类型的微优化相比,checkcast需要多少性能?
答案 0 :(得分:0)
确切的细节当然取决于体系结构。
基元和对象的铸造在很大程度上无关。
对于原始转换,可能需要在整数寄存器和浮点寄存器之间移动值或进行符号扩展,但是这些操作通常非常快,与内存访问时间相形见。
对象不同。
bytecode-> native编译器也许能够证明对象的转换始终成功,因此在运行时不会发生任何动作。
通常,成功完成checkcast
几乎没有性能开销。有各种优化方法(对此可能会有合理的指导)。即使您只是想高效地调用虚拟方法,大多数优化也是必需的。此外,泛型只是“编译器小说”,因此隐式强制转换非常普遍。在过去,由于简化了虚拟方法的分配,与接口相比,抽象类可能更受人们青睐,但是二十年来没人照顾它。
在您的示例代码中,强制转换可能总是成功的。否则,由于String
是最后的,唯一必要的检查是对象标头中的类型信息正确。不需要进一步的内存访问。