10個嵌入式C代碼優化技巧,總有你不知道的,點滴之間漲水平

代碼優化有兩個方面,一個是速度優化,一個是代碼大小優化,今天這10個技巧主要是

代碼大小優化,特別適用於8位單片機上,代碼是XC8編輯器(V1.42)測試通過。

1.使用短數學表達式

<code>void main(void)
{
int a, b;
a = (b-1)*3;
}/<code>

代碼大小50字節,可改為

<code>void main(void)
{
int a, b;
a = (b-1);
a = a+a+a;
}/<code>

改後代碼25字節。

2.使用if代替switch

<code>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 ;
}
}/<code>

改為

<code>void main(void)
{
int a, b ;
if (a == 0) b = a + 5 ;
if (a == 1) b = a * 5 ;
if (a == 2) b = a – 5 ;
}/<code>

改之前79字節,改後74字節。

3.字符判斷(大小寫無關)

<code>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 ;
}/<code>

改為

<code>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 ;
}/<code>

改之前84字節,改後77字節。

4.少用else

<code>void main(void)
{
int a, b, c ;
if (a == 0) b = 0 ; else b = (a – c) * 100 ;
}/<code>

改為

<code>void main(void)
{
int a, b, c ;
b = 0 ;
if (a) b = (a – c) * 100 ;
}/<code>

改之前64字節,改後63字節。

5.多用一維數組

<code>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] ;
}/<code>

改為

<code>void main(void)
{
const char TabMois[] =
"JanFebMarAprMayJunJulAugSepOctNovDec" ;
char ch1 = TabMois[0],
ch2 = TabMois[1],
ch3 = TabMois[2] ;
}/<code>

改之前149字節,改後68字節。

6.用整數代替浮點數運算

<code>int Measure (unsigned int canal)
{ //…
\treturn ((ADRESH<<8) + ADRESL) ;
}/<code>
<code>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 ;
}/<code>

改為

<code>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 ;
}/<code>

改之前841字節,改後570字節。

7.for優化

<code>void main(void)
{
\tfor (a = 10 ; a > 0 ; a–)
\t\tb = c + a ;
}/<code>

改為

<code>void main(void)
{
for (a = 10 ; a– ; )
b = c + a ;
}/<code>

改之前43字節,改後27字節。

8.把乘法改為除法

<code>void main(void)
{
float a, b, c ;
a = (b + c) * 0.1 ;
}/<code>

改為

<code>void main(void)
{
float a, b, c ;
a = (b + c) / 10.0 ;
}/<code>

改之前570字節,改後559字節。

9.多用無符號整數

<code>void main(void)
{
int Vbat ; // 1, 2, …, 1023
Vbat = 1023 / Vbat ; // 例1
Vbat = (2048L * 15) / Vbat ; // 例2
}/<code>

改為

<code>void main(void)
{
int Vbat ; // 1, 2, …, 1023
Vbat = 1023U / Vbat ; // 例1
Vbat = (2048UL * 15) / Vbat ; // 例2
}/<code>

改之前102,160字節,改後73,114字節。

10.選擇合理的判斷語句

<code>void main(void)
{
int a, b ;
if (a – b) b = (a – 5) * 100 ; // 例1
if (b > a) b = (a – 5) * 100 ; // 例2
if (b – a > 0) b = (a – 5) * 100 ; // 例3
}/<code>

改為

<code>void main(void)
{

int a, b ;
if (a != b) b = (a – 5) * 100 ; // 例1
if (a < b) b = (a - 5) * 100 ; // 例2
if (a – b < 0) b = (a - 5) * 100 ; // 例3
}/<code>

改之前67,62,77字節,改後58,62,65字節。

看完之後,有沒有收穫,有的話關注一下,謝謝。


分享到:


相關文章: