同上一篇,看《c++反汇编与逆向分析技术揭秘》总结。
if...else与switch...case比较
1 分支数低于4个时,if…else地效率高于switch…case(VC6.0)
2 分指数大于等于4个且case条件具有明显的线性关系时,switch…case效率高于if…else,但会占用额外空间
3 当分支地case条件之间不具有明显线性关系时,效率会有所下降,且会占用更多额外空间
1 原因:
VC6.0编译器在低分支时,switch…case是模拟if…else进行处理地,所以效率较低
2 原因:
当分支数大于3,且分支条件具有明显线性关系时,switch…case会维护一个case地址数组,也称“case地址表”,将case条件作为下标直接跳转,而不是一个一个地顺序执行地分支判定
3 原因:
case差值低于255时(一字节索引范围以内),此时会在创建case地址表的基础上再维护一个索引表,一一对应的进行分支跳转
case差值高于255时(一字节索引范围以外),此时将会以一种二叉判定树的方式进行case语句的比对选择。然后再对各分支叶子节点进行判断,步骤如下:
1)子节点(case条件个数)小于4,直接使用if…else结构进行处理
2)子节点大于等于4,case具有明显线性关系,创建case地址表,详细见上文2
3)子节点大于等于4,case不具有明显线性关系且case差值低于255,创建case地址表,并再维护一个索引表,详情见上文3
4)子节点大于等于4,case不具有明显线性关系且case差值高于255,再次进行判断树创建,并递归上述操作