Lookupswitch use < strong > a table with key and label
Tablesswitch 使用 只有标签的桌子。
执行 桌子开关时,堆栈顶部的 int 值直接用作表的索引,以获取跳转目标并立即执行跳转。整个查找 + 跳转过程是一个 O (1)操作,这意味着它非常快。
执行 查找开关时,将将堆栈顶部的 int 值与表中的键进行比较,直到找到匹配项,然后使用该键旁边的跳转目标执行跳转。因为查找开关表总是 必须解决,所以每个 X < Y 的 keyX < keyY,整个查找 + 跳转过程是一个 O (log n)操作,因为键将使用二进制搜索算法进行搜索(没有必要将 int 值与所有可能的键进行比较以找到匹配或确定没有一个键匹配)。O (log n)比 O (1)稍微慢一些,但是仍然可以,因为许多著名的算法是 O (log n) ,这些算法通常被认为是快的; 甚至 O (n)或 O (n * log n)仍然被认为是一个相当好的算法(慢/坏的算法有 O (n ^ 2) ,O (n ^ 3) ,甚至更糟)。
编译器根据 switch 语句的 紧凑型状态来决定使用哪条指令,例如。
switch (inputValue) {
case 1: // ...
case 2: // ...
case 3: // ...
default: // ...
}
int val = pop(); // pop an int from the stack
if (val < low || val > high) { // if its less than <low> or greater than <high>,
pc += default; // branch to default
} else { // otherwise
pc += table[val - low]; // branch to entry in table
}