新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 高效的C编程之:Switch语句

高效的C编程之:Switch语句

作者:时间:2013-09-30来源:网络收藏

14.6

编译器通常将C语言中的编译一个(TableLookup)以便跳转到合适的入口处。

本文引用地址:http://www.eepw.com.cn/article/257019.htm

下面的例子显示了编译器如何处理程序中的Switch语言的。

C源程序如下。

char*ConditionStr1(intcondition)

{

switch(condition)

{

case0:returnEQ;

case1:returnNE;

case2:returnCS;

case3:returnCC;

case4:returnMI;

case5:returnPL;

case6:returnVS;

case7:returnVC;

case8:returnHI;

case9:returnLS;

case10:returnGE;

case11:returnLT;

case12:returnGT;

case13:returnLE;

case14:return;

default:return0;

}

}

编译后的结果如下。

ConditionStr1:

0000807CE1A01000MOVr1,r0

>>>SWITCH\#3switch(condition)

00008080E351000ECMPr1,#0xe

00008084908FF101ADDLSpc,pc,r1,LSL#2

00008088EA00003BB0x817cSWITCH\#20>

0000808CEA00000DB0x80c8SWITCH\#5>

00008090EA00000FB0x80d4SWITCH\#6>

00008094EA000011B0x80e0SWITCH\#7>

00008098EA000013B0x80ecSWITCH\#8>

0000809CEA000015B0x80f8SWITCH\#9>

000080A0EA000017B0x8104SWITCH\#10>

000080A4EA000019B0x8110SWITCH\#11>

000080A8EA00001BB0x811cSWITCH\#12>

000080ACEA00001DB0x8128SWITCH\#13>

000080B0EA00001FB0x8134SWITCH\#14>

000080B4EA000021B0x8140SWITCH\#15>

000080B8EA000023B0x814cSWITCH\#16>

000080BCEA000025B0x8158SWITCH\#17>

000080C0EA000027B0x8164SWITCH\#18>

000080C4EA000029B0x8170SWITCH\#19>

对于代码,的入口为4字节;Thumb代码的入口为1或2个字节(当Case情况小于32时,使用入口为1字节的查找表)。所以当使用时,应尽量较少Case分支。

另外,为了提高系统性能,也可以手工编写代码,形成程序跳转来避免使用Switch语句。

下面的例子显示对上面Switch分支语句的改写。

char*ConditionStr2(intcondition)

{

if((unsigned)condition>=15)return0;

return

EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0+

3*condition;

}

编译后的代码如下所示。

ConditionStr2:

00008188E1A01000MOVr1,r0

>>>SWITCH\#26if((unsigned)condition>=15)return0;

0000818CE351000FCMPr1,#0xf

000081903A000001BCC0x819cSWITCH\#27>

>>>SWITCH\#26if((unsigned)condition>=15)return0;

00008194E3A00000MOVr0,#0

>>>SWITCH\#30}

00008198E12FFF1EBXr14

>>>SWITCH\#26if((unsigned)condition>=15)return0;

>>>SWITCH\#27return

0000819CE28F005CADRr0,{pc}+0x64;#0x8200

000081A0E3A02003MOVr2,#3

000081A4E0200291MLAr0,r1,r2,r0

000081A8EAFFFFFAB0x8198SWITCH\#30>

>>>SWITCH\#33{

从两段汇编代码的分析可以看出,使用跳转表需要240bytes,而第二种做法只用了72bytes。



评论


相关推荐

技术专区

关闭