本帖最后由 责任全在软件 于 2023-5-22 13:39 编辑

代码优化有两个方面,一个是速度优化,一个是代码大小优化,今天这10个技巧主要是代码大小优化,特别适用于8位单片机上,代码是XC8编辑器(V1.42)测试通过。
1.使用短数学表达式
  • C++
  • void main(void){
  •   int a, b;
  •   a = (b-1)*3;
  • }
  • 复制代码
    代码大小50字节,可改为
  • C++
  • void main(void){
  •   int a, b;
  •   a = (b-1);
  •   a = a+a+a;
  • }
  • 复制代码
    改后代码25字节。
    2.使用if代替switch
  • C++
  • void main(void){
  •   int a, b ;
  •   switch (a)
  •   {
  •     case 0: b = a + 5 ; break ;
  •     case 1: b = a * 5 ; break ;
  •     case 2: b = a – 5 ; break ;
  •   }
  • }
  • 复制代码
    改为
  • YAML
  • void main(void){int a, b ;if (a == 0) b = a + 5 ;if (a == 1) b = a * 5 ;if (a == 2) b = a – 5 ;}
  • 复制代码
    改之前79字节,改后74字节。
    3.字符判断(大小写无关)
  • Nginx
  • void main(void)
  • {
  •   char chx ;
  •   if (chx == 'a' || chx == 'A') b = a + 5 ;
  •   if (chx == 'm' || chx == 'M') b = a – 10 ;
  •   if (chx == 't' || chx == 'T') b = a * 25 ;
  • }
  • 复制代码
    改为
    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 ;
  •   if (a == 0) b = 0 ; else b = (a – c) * 100 ;
  • }
  • 复制代码
    改为
    C++
  • void main(void){
  •   int a, b, c ;
  •   b = 0 ;
  •   if (a) b = (a – c) * 100 ;
  • }
  • 复制代码
    改之前64字节,改后63字节。
    5.多用一维数组
    Markdown
  • void 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] ;
  • }
  • 复制代码
    改为
  • C++
  • void main(void){
  •    const char TabMois[] =
  •   "JanFebMarAprMayJunJulAugSepOctNovDec" ;
  •   char ch1 = TabMois[0],
  •   ch2 = TabMois[1],
  •   ch3 = TabMois[2] ;
  • }
  • 复制代码
    改之前149字节,改后68字节。
    6.用整数代替浮点数运算
    C++
  • int Measure (unsigned int canal){ //…return ((ADRESH<<8) + ADRESL) ;
  • }
  • 复制代码
    Properties
  • void 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 ;}
  • 复制代码

    改为
    Properties
  • void 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
  • }
  • 复制代码
    改为
  • C++
  • void main(void){
  •   int Vbat ; // 1, 2, …, 1023
  •   Vbat = 1023U / Vbat ; // 例1
  •   Vbat = (2048UL * 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字节。