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

不二星空 2012-05-02 06:08:12
一个长约400行的switch ... case语句,是否有拆分优化的必要?
...全文
348 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuzhoulh 2012-05-03
  • 打赏
  • 举报
回复
如果case语句中的条件可以分类的话,可以分类处理,这样会更清晰
不二星空 2012-05-03
  • 打赏
  • 举报
回复
谢谢大家明白了。主要是可读性方面可以进行优化
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
一个长约400行的switch ... case语句,是否有拆分优化的必要?
[/Quote]
400行还好吧,只要不影响可读性就算了;排版和程序组织上注意一下就好了,现在编译器都有助手,可以将一个指令块折叠起来
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

是不是要用到函数指针的数组?
[/Quote]
不需要,函数指针在每次调用会有压栈、返回时会有出栈动作;而编译器会将一个比较大的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分支,注意,这里不是使用的函数指针;函数指针会有压栈和出栈动作;
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

做一个映射, 每个case的值映射到一个函数指针,就不需要写这么多case 了。
[/Quote]
多数编译器(GCC、VC等)可以将case语句编译成间接跳转表形式(会比函数指针更快些),因此,没有必要
chenjiawei007 2012-05-02
  • 打赏
  • 举报
回复
拆分下吧,没用的地方加行注释和一个接口就清爽多了。
用户 昵称 2012-05-02
  • 打赏
  • 举报
回复
没必要,不过俺会用函数指针方式来实现,但是俺不管这个叫优化。
shawn 2012-05-02
  • 打赏
  • 举报
回复
做一个映射, 每个case的值映射到一个函数指针,就不需要写这么多case 了。
FresfAir 2012-05-02
  • 打赏
  • 举报
回复
个人认为,如果每个case中的代码比较多的话应写成单独的函数。假设只是case比较多,则没太大必要分开。
函数应遵循单一功能和简洁有效,但也存在个别情况
  • 打赏
  • 举报
回复
得要看你的case是否经常增加
schlafenhamster 2012-05-02
  • 打赏
  • 举报
回复
是不是要用到函数指针的数组?
不二星空 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
有的,每个case分支都给整成一个函数,看着清爽些
[/Quote]
case很多 case里面的内容很少
Kaile 2012-05-02
  • 打赏
  • 举报
回复
有的,每个case分支都给整成一个函数,看着清爽些

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧