我正在尝试提高解析器的速度。而且switch-case
,有时它很有用,但我发现它仍然很慢。不确定 - 如果 C++ 支持此功能(地址检查点(带有附加参数)),那就太好了!
简单的例子:
enum Transport //MOTORBIKE = 1, CAR = 2, ... SHIP = 10
Transport foo = //unknown
switch(foo)
{
case MOTORBIKE : /*do something*/ break;
case CAR : /*do something*/ break;
//////////////////////////
case SHIP : /*do something*/ break;
}
如果变量foo
是SHIP
,至少程序必须重新检查该值多达十次!-> 它仍然很慢。
如果 C++ 支持检查点:
Transport foo = //unknown
__checkpoint smart_switch;
goto (smart_switch + foo); //instant call!!!
smart_switch + MOTORBIKE : /*do something*/ goto __end;
smart_switch + CAR : /*do something*/ goto __end;
smart_switch + [...] : /*do something*/ goto __end;
////////////////////////////////////////////////////////////
smart_switch + SHIP : /*do something*/ goto __end;
__end : return 0;
它不会生成任何跳转表,然后检查每个值。也许它不适用于default
案例。唯一的问题是smart_switch + CAR
->smart_switch + SHIP
可能有不同的地址,因此如果 C++ 将它们评估为真实地址,则该过程将失败。因此,在编译编译器时,只需将它们转换为真实地址。
C++ 是否支持此功能?它是否大大提高了速度和性能?