一个长约400行的switch ... case语句,是否有拆分优化的必要? 一个长约400行的switch ... case语句,是否有拆分优化的必要? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有的,每个case分支都给整成一个函数,看着清爽些 case很多 case里面的内容很少 个人认为,如果每个case中的代码比较多的话应写成单独的函数。假设只是case比较多,则没太大必要分开。函数应遵循单一功能和简洁有效,但也存在个别情况 做一个映射, 每个case的值映射到一个函数指针,就不需要写这么多case 了。 多数编译器(GCC、VC等)可以将case语句编译成间接跳转表形式(会比函数指针更快些),因此,没有必要 不需要,函数指针在每次调用会有压栈、返回时会有出栈动作;而编译器会将一个比较大的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分支,注意,这里不是使用的函数指针;函数指针会有压栈和出栈动作; 如果case语句中的条件可以分类的话,可以分类处理,这样会更清晰 IoCompleteRequest() 指定的目录有空格,怎么在下面建目录 对我来说太有挑战性!!!一个系统内核问题,自己无法解决 谁有《windows网络编程(第二版)》发过来好么?QQ:407243538 问一个变量命名的问题。 简单的问题啊 DSOFramer控件全屏实现 .rc资源文件使用的是什么语言? 弱智问题!想不起来了! 怎么删除文件? 基于VC++的ICMP网络协议的实现(大家指点一下,才学网络编程) 有了IP地址,为什么还要MAC地址
函数应遵循单一功能和简洁有效,但也存在个别情况
.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分支,注意,这里不是使用的函数指针;函数指针会有压栈和出栈动作;