代码优化有两个方面,一个是速度优化,一个是代码大小优化,今天这10个技巧主要是代码大小优化,特别适用于8位单片机上,代码是XC8编辑器(V1.42)测试通过。
1.使用短数学表达式
代码大小50字节,可改为
改后代码25字节。
2.使用if代替switch
改为
改之前79字节,改后74字节。
3.字符判断(大小写无关)
改为
C++void main(void){ char chx ; // to lower case, alphabetical only chx = chx | 0x20 ; if (chx == 'a') b = a + 5 ; if (chx == 'm') b = a – 10 ; if (chx == 't') b = a * 25 ; }
复制代码改之前84字节,改后77字节。
4.少用else
改为
C++void main(void){ int a, b, c ; b = 0 ; if (a) b = (a – c) * 100 ; }
复制代码改之前64字节,改后63字节。
5.多用一维数组
Markdownvoid main(void) { const char *TabMois[] = {"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"} ; char ch1 = TabMois[0][0], ch2 = TabMois[0][1], ch3 = TabMois[0][2] ; }
复制代码改为
改之前149字节,改后68字节。
6.用整数代替浮点数运算
C++int Measure (unsigned int canal){ //…return ((ADRESH<<8) + ADRESL) ; }
复制代码Propertiesvoid main(void){float Vbat, Vmean=0 ; int a, cnt = 60 ;while (cnt){if (TMR1IF){ Vbat = Measure(a) * 4.88 ;Vmean += Vbat ; cnt– ;TMR1IF = 0 ; }}Vmean /= 60 ;}
复制代码改为
Propertiesvoid main(void){float Vmean; int a, cnt, Vbat, Vbat60=0 ;while (cnt){if (TMR1IF){ Vbat = Measure(a) ;Vbat60 += Vbat ;cnt– ;TMR1IF = 0 ;}}Vmean = (Vbat60 * 4.88) / 60 ;}
复制代码改之前841字节,改后570字节。
7.for优化
C++void main(void){ for (a = 10 ; a > 0 ; a–) b = c + a ; }
复制代码改为
C++void main(void){ for (a = 10 ; a– ; ) b = c + a ; }
复制代码改之前43字节,改后27字节。
8.把乘法改为除法
C++void main(void){ float a, b, c ; a = (b + c) * 0.1 ; }
复制代码改为
C++void main(void){ float a, b, c ; a = (b + c) / 10.0 ; }
复制代码改之前570字节,改后559字节。
9.多用无符号整数
C++void main(void){ int Vbat ; // 1, 2, …, 1023 Vbat = 1023 / Vbat ; // 例1 Vbat = (2048L * 15) / Vbat ; // 例2 }
复制代码改为
改之前102,160字节,改后73,114字节。
10.选择合理的判断语句
C++void main(void){ int a, b ; if (a – b) b = (a – 5) * 100 ; // 例1if (b > a) b = (a – 5) * 100 ; // 例2if (b – a > 0) b = (a – 5) * 100 ; // 例3 }
复制代码改为
C++void main(void){ int a, b ; if (a != b) b = (a – 5) * 100 ; // 例1if (a < b) b = (a - 5) * 100 ; // 例2if (a – b < 0) b = (a - 5) * 100 ; // 例3 }
复制代码改之前67,62,77字节,改后58,62,65字节。