user-0 提问: 逻辑简单但是超长函数的优化

回复:
user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:透露一个看Release版对应汇编指令的绝招，一般人我不告诉他： 临时在要看对应汇编指令的地方加一句DebugBreak();或__asm int 3 然后在VS IDE里面运行，停在加的那句时，按Alt+8打开汇编窗口。

user: user-1
content: 透露一个看Release版对应汇编指令的绝招，一般人我不告诉他： 临时在要看对应汇编指令的地方加一句DebugBreak();或__asm int 3 然后在VS IDE里面运行，停在加的那句时，按Alt+8打开汇编窗口。

user: user-0
content: 引用 9 楼 Liu_peiqi 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 听鄙人的，不要做任何改动，Release版编译器会优化的不能再优化的。 不信可以看Release版对应的汇编指令，肯定是用跳转表的方法。正在编译，看看情况，先谢赵老师[/quote]好像是这个样子的，指令一会儿就跳出函数了。。。。。。。看来我是想多了。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:听鄙人的，不要做任何改动，Release版编译器会优化的不能再优化的。 不信可以看Release版对应的汇编指令，肯定是用跳转表的方法。正在编译，看看情况，先谢赵老师

user: user-1
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应Debug版汇编一行！ 单步Debug版汇编千行不如单步对应Release版汇编一行！

user: user-1
content: 听鄙人的，不要做任何改动，Release版编译器会优化的不能再优化的。 不信可以看Release版对应的汇编指令，肯定是用跳转表的方法。

user: user-2
content: 这种结构明显应该用查表的方法，用数组和下标进行操作。  引用 楼主 Liu_peiqi 的回复:我遇到一个取值函数，逻辑特简单，全部函数内容就是一个switch case结构，每个case平均也3行代码，因为代码很长很长（平均3000行）我就简化如下：  int getModValue( int witchValue, int *value) {     switch(witchValue)     {     case MOD1ST:         *value=mod->MOD1STval;         break;     case MOD2ED:         *value=mod->MOD2EDval;         break;     //几千行这样的代码.....     default:         return ERROR;         break;     }     return NO_ERROR; } 函数很长，但是只有那么一点点功能，上层一般会调用300次左右。请问大神们，这种函数有优化的可能吗？现在程序对性能很敏感的。。。 。。。

user: user-3
content: 引用 4 楼 Liu_peiqi 的回复:[quote=引用 2 楼 mujiok2003 的回复:] [quote=引用 1 楼 wangdahu888 的回复:] 做个table对应不行嘛  表驱动。[/quote]与取值对应的函数还有赋值函数 int setValue (int witchVal, int val) {     switch(witchVal)     {      case MOD1ST:         mod->MOD1STval = val;         mod->MOD1SThaveVal = TRUE;         break; //*****************************     }     renture NO_ERROR; } haveVal是结构体mod定义的位，unsigned MOD1SThaveVal:1; 这样的话怎么设计比较好？是把val和haveVal绑定一个结构体（这样的话，因为有字节对齐，要浪费不少内存），还是独立维护两个表（项目很多，万一没对准，就跪了。。。。。），还是请大神指点[/quote]  不连续的问题这么解决：   int modes[4] = {3,4, 9, 5}; //不重复 typedef int (*OP)(Mode*); OP ops[4] = {....}; //与modes对应 int index = std::find(modes,modes+4, your_mode) - modes;  your_value = ops[index](mod);

user: user-0
content: 引用 2 楼 mujiok2003 的回复:[quote=引用 1 楼 wangdahu888 的回复:] 做个table对应不行嘛  表驱动。[/quote]与取值对应的函数还有赋值函数 int setValue (int witchVal, int val) {     switch(witchVal)     {      case MOD1ST:         mod->MOD1STval = val;         mod->MOD1SThaveVal = TRUE;         break; //*****************************     }     renture NO_ERROR; } haveVal是结构体mod定义的位，unsigned MOD1SThaveVal:1; 这样的话怎么设计比较好？是把val和haveVal绑定一个结构体（这样的话，因为有字节对齐，要浪费不少内存），还是独立维护两个表（项目很多，万一没对准，就跪了。。。。。），还是请大神指点

user: user-0
content: 引用 楼主 Liu_peiqi 的回复:我遇到一个取值函数，逻辑特简单，全部函数内容就是一个switch case结构，每个case平均也3行代码，因为代码很长很长（平均3000行）我就简化如下：  int getModValue( int witchValue, int *value) {     switch(witchValue)     {     case MOD1ST:         *value=mod->MOD1STval;         break;     case MOD2ED:         *value=mod->MOD2EDval;         break;     //几千行这样的代码.....     default:         return ERROR;         break;     }     return NO_ERROR; } 函数很长，但是只有那么一点点功能，上层一般会调用300次左右。请问大神们，这种函数有优化的可能吗？现在程序对性能很敏感的。。。 。。。有时候因为种种原因，casee标签的序号会发生变化，有时候也不连续。。。。。

user: user-3
content: 引用 1 楼 wangdahu888 的回复:做个table对应不行嘛  表驱动。

user: user-4
content: 做个table对应不行嘛