多分支条件下Switch为什么比if-else快

一、问题背景

在做语句块级别的动态插桩工具时,需要获取方法中的控制流信息,需要解析jvm指令。像for、while等循环,解除语法糖后会变成if、goto语句,这其中比较难解析的是tableSwitch与lookupswitch指令,他们对应Java语法中的Switch语句。

二、指令分析

  1. 这两个字节码指令后都会跟0-3个nop空白填充,目的是为了让操作数能够4字节对齐
  2. 其中tableSwitch对齐填充后会跟三个32位有符号整数,即default地址、low值、high值。再然后会跟high-low+1个32位有符号整数作为偏移量offset,这些偏移量构成了0基址跳转表。当指令执行时,要比较的index从操作数栈中出栈,若index<low或>high,会用default作为目标地址进行跳转。否则,在跳转表中将index-low的地址值当做目标地址进行跳转
  3. lookupswitch对齐填充后会跟2个32位有符号整数,其中一个是default地址,另一个数npairs代表match-offset对的数量。再然后会跟npairs个match-offset对。这些match-offset对按照match值升序存放,当指令执行时,要比较的index从操作数栈中出栈,跟每一个match值进行比较,如果有相同的就以对应的offset值作为目标跳转地址,若没有相同的,就以default作为目标跳转地址

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值