3 回答
TA贡献1835条经验 获得超7个赞
甲开关构建体更容易地转换成一个跳跃(或分支)表。当案例标签靠在一起时,这可使switch语句比if-else效率更高。这个想法是将一堆跳转指令顺序地放在内存中,然后将其值添加到程序计数器中。这将一系列比较指令替换为加法运算。
以下是一些极为简化的伪装配件示例。首先,if-else版本:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
接下来是交换机版本:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
您可以看到生成的汇编代码更加紧凑。请注意,需要以某种方式转换该值以处理除1、2和3以外的其他值。但是,这应该可以说明该概念。
TA贡献1820条经验 获得超2个赞
我忽略了通常不重要的这种低级优化类型,并且可能因编译器而异。
我想说的主要区别是可读性。if / else非常灵活,但是当您看到一个开关时,您立即知道所有测试都针对同一个表达式。
TA贡献1810条经验 获得超4个赞
为了表现力,switch / case语句允许您将多个案例组合在一起,例如:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
为了提高性能,编译器有时可以将switch语句优化为跳转表。
- 3 回答
- 0 关注
- 1020 浏览
添加回答
举报