一个长约400行的switch ... case语句,是否有拆分优化的必要?

解决方案 »

  1.   

    有的,每个case分支都给整成一个函数,看着清爽些
      

  2.   

    case很多 case里面的内容很少
      

  3.   

    个人认为,如果每个case中的代码比较多的话应写成单独的函数。假设只是case比较多,则没太大必要分开。
    函数应遵循单一功能和简洁有效,但也存在个别情况
      

  4.   

    做一个映射, 每个case的值映射到一个函数指针,就不需要写这么多case 了。
      

  5.   

    多数编译器(GCC、VC等)可以将case语句编译成间接跳转表形式(会比函数指针更快些),因此,没有必要
      

  6.   

    不需要,函数指针在每次调用会有压栈、返回时会有出栈动作;而编译器会将一个比较大的case最终生成跳转表的形式,这样比您用函数指针效率还要高;如图(不会贴图,凑合着看):
    .text:005EA884                 lw      $v0, 0x20+var_10($fp)  # Load Word
    .text:005EA888                 nop
    .text:005EA88C                 sll     $v1, $v0, 2      # Shift Left Logical
    .text:005EA890                 la      $v0, 0x13F0000   # Load Address
    .text:005EA894                 nop
    .text:005EA898                 addiu   $v0, (off_13EF420 - 0x13F0000)  # Add Immediate Unsigned
    .text:005EA89C                 addu    $v0, $v1, $v0    # Add Unsigned
    .text:005EA8A0                 lw      $v0, 0($v0)      # Load Word
    .text:005EA8A4                 nop
    .text:005EA8A8                 addu    $v0, $gp         # Add Unsigned
    .text:005EA8AC                 jr      $v0              # Jump Register这是一段典型的switch... case....,是GCC编译,通过反向工具反向的(MIPS R3000指令):
    1)所有case被保存在跳转表中:off_13EF420 
    2)var_10是switch的条件
    3)通过jr(MIPS R3000指令)绝对跳转指令直接跳转到相关的case分支,注意,这里不是使用的函数指针;函数指针会有压栈和出栈动作;
      

  7.   

    如果case语句中的条件可以分类的话,可以分类处理,这样会更清晰