我发现在C++的switch
语句中只能使用数字值,因此我认为它与一组if-else
语句之间必须存在某些更深层次的差异。
因此,我问了自己以下问题:
switch
和if-elseif-elseif
在运行时速度、编译时优化和一般编译方面有何区别?我主要在谈论MSVC。
我发现在C++的switch
语句中只能使用数字值,因此我认为它与一组if-else
语句之间必须存在某些更深层次的差异。
因此,我问了自己以下问题:
switch
和if-elseif-elseif
在运行时速度、编译时优化和一般编译方面有何区别?我主要在谈论MSVC。交换机通常被编译成跳转表(先进行一次比较以找出要运行的代码),如果不可能,编译器仍将重新排列比较操作,以便在这些值中执行二分查找(log N比较操作)。if-else链是一种线性搜索(尽管,我猜想,如果所有相关值都是编译时整数常量,编译器原则上可以执行类似的优化)。
log n
次比较。然而,你需要访问内存,这可能会使其运行时间变慢。 - FlamefireSwitch语句通常是编译器优化的常见来源。也就是说,它们的处理方式取决于您在编译器上使用的优化设置。
编译Switch语句的最基本(未经过优化的)方法是将其视为一系列if ... else if ...
语句。编译器通常优化Switch语句的方法是将其转换为跳转表,其可以类似于:
if (condition1) goto label1;
if (condition2) goto label2;
if (condition3) goto label3;
else goto default;
label1:
<<<code from first `case statement`>>>
goto end;
label2:
<<<code from first `case statement`>>>
goto end;
label3:
<<<code from first `case statement`>>>
goto end;
default:
<<<code from `default` case>>>
goto end;
end:
goto end
语句)。switch
中嵌套一个 switch
(我不确定 MSVC 特别处理嵌套的 switch
的方式,但编译器手册应该会告诉您)。