嵌入式编程C语言提高代码效率的14种方法
? ? ? ? ? ? ? ? 嵌入式編程C語言提高代碼效率的14種方法
?
1、在可能的情況下使用typedef替代define.當(dāng)然有時(shí)候你無法避免define,但是typedef更好。
typedef??int*??INT_PTR;? INT_PTR??a?,b;#?define?INT_PTR??int*;? INT_PTR??a?,b; int?x?=?4;? if(x?=?1) {x?=?x?+?2;printf("%d",x);//?Output?is?3?? }int?x?=?4;if(1?=?x){x?=?x?+?2;?printf("%d",x);?//?Compilation?error }在這個(gè)宏定義中,a是一個(gè)指向整數(shù)的指針,而b是只有一個(gè)整數(shù)聲明。使用typedef?a和b都是整數(shù)的指針。
2、在一個(gè)邏輯條件語句中常數(shù)項(xiàng)永遠(yuǎn)在左側(cè)。
使用"="賦值運(yùn)算符,替代"=="相等運(yùn)算符,這是個(gè)常見的輸入錯(cuò)誤。常數(shù)項(xiàng)放在左側(cè),將產(chǎn)生一個(gè)編譯時(shí)錯(cuò)誤,讓你輕松捕獲你的錯(cuò)誤。注:"="是賦值運(yùn)算符。b=1會(huì)設(shè)置變量b等于值1。"=="相等運(yùn)算符。如果左側(cè)等于右側(cè),返回true,否則返回false。
3、確保聲明和定義是靜態(tài)的,除非您希望從不同的文件中調(diào)用該函數(shù)。
在同一文件函數(shù)對(duì)其他函數(shù)可見,才稱之為靜態(tài)函數(shù)。它限制其他訪問內(nèi)部函數(shù),如果我們希望從外界隱藏該函數(shù)。
現(xiàn)在我們并不需要為內(nèi)部函數(shù)創(chuàng)建頭文件,其他看不到該函數(shù)。靜態(tài)聲明一個(gè)函數(shù)的優(yōu)點(diǎn)包括:
(1)兩個(gè)或兩個(gè)以上具有相同名稱的靜態(tài)函數(shù),可用于在不同的文件。
(2)編譯消耗減少,因?yàn)闆]有外部符號(hào)處理。
4、節(jié)約內(nèi)存(內(nèi)存對(duì)齊和填充的概念)
struct{??char c;?int i;?short s;
}str_1;??struct{?char c;?short s;?int i;
}str_2;?
假設(shè)一個(gè)字符需要1個(gè)字節(jié),short占用2個(gè)字節(jié)和int需要4字節(jié)的內(nèi)存。起初,我們會(huì)認(rèn)為上面定義的結(jié)構(gòu)是相同的,因此占據(jù)相同數(shù)量的內(nèi)存。然而,而str_1占用12個(gè)字節(jié),第二個(gè)結(jié)構(gòu)只需要8個(gè)字節(jié)?這怎么可能呢???
請(qǐng)注意,在第一個(gè)結(jié)構(gòu),3個(gè)不同的4個(gè)字節(jié)被分配到三種數(shù)據(jù)類型,而在第二個(gè)結(jié)構(gòu)的前4個(gè)自己char和short可以被采用,int可以采納在第二個(gè)的4個(gè)字節(jié)邊界(一共8個(gè)字節(jié))
5、使用無符號(hào)整數(shù),而不是整數(shù)的,如果你知道的值將永遠(yuǎn)是否定的。
有些處理器可以處理無符號(hào)的整數(shù),比有符號(hào)整數(shù)的運(yùn)算速度要快。(這也是很好的實(shí)踐,幫助self-documenting代碼)
6、switch-case語句。在程序中經(jīng)常會(huì)使用switch-case語句
每一個(gè)由機(jī)器語言實(shí)現(xiàn)的測(cè)試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么,就浪費(fèi)了處理器時(shí)間。為了提高速度,可以把具體的情況按照它們發(fā)生的相對(duì)頻率排序。即把最可能發(fā)生的情況放在第一,最不可能發(fā)生的情況放在最后,這樣會(huì)減少平均的代碼執(zhí)行時(shí)間。當(dāng)switch語句中的case標(biāo)號(hào)很多時(shí),為了減少比較的次數(shù),明智的做法是把大switch語句轉(zhuǎn)為嵌套switch語句。把發(fā)生頻率高的case標(biāo)號(hào)放在一個(gè)switch語句中,并且是嵌套switch語句的最外層,發(fā)生相對(duì)頻率相對(duì)低的case標(biāo)號(hào)放在另一個(gè)switch語句中。比如,下面的程序段把相對(duì)發(fā)生頻率低的情況放在缺省的case標(biāo)號(hào)內(nèi)。
如果switch中每一種情況下都有很多的工作要做,那么把整個(gè)switch語句用一個(gè)指向函數(shù)指針的表來替換會(huì)更加有效,比如下面的switch語句,有三種情況:
enum?MsgType{Msg1,?Msg2,?Msg3} switch?(ReceiveMessage()) {case?Msg1;...... case?Msg2;..... case?Msg3;..... }為了提高執(zhí)行速度,用下面這段代碼來替換這個(gè)上面的switch語句/*準(zhǔn)備工作*/ int?handleMsg1(void); int?handleMsg2(void); int?handleMsg3(void);/*創(chuàng)建一個(gè)函數(shù)指針數(shù)組*/? int?(*MsgFunction?[])()={handleMsg1,?handleMsg2,?handleMsg3};/*用下面這行更有效的代碼來替換switch語句*/ status=MsgFunction[ReceiveMessage()]();
7、全局變量。
使用全局變量比向函數(shù)傳遞參數(shù)更加有效率,這樣做去除了函數(shù)調(diào)用前參數(shù)入棧和函數(shù)完成后參數(shù)出棧的需要。當(dāng)然,使用全局變量會(huì)對(duì)程序有一些負(fù)作用。使用全局變量比函數(shù)傳遞參數(shù)更加有效率。這樣做去除了函數(shù)調(diào)用參數(shù)入棧和函數(shù)完成后參數(shù)出棧所需要的時(shí)間。然而決定使用全局變量會(huì)影響程序的模塊化和重入,故要慎重使用。
8、嵌入式系統(tǒng)編程應(yīng)避免使用標(biāo)準(zhǔn)庫例程
因?yàn)楹芏啻蟮膸炖淘O(shè)法處理所有可能的情況,所以占用了龐大的內(nèi)存空間,因而應(yīng)盡可能地減少使用標(biāo)準(zhǔn)庫例程。
9、Inline函數(shù)。
在C++中,關(guān)鍵字Inline可以被加入到任何函數(shù)的聲明中。這個(gè)關(guān)鍵字請(qǐng)求編譯器用函數(shù)內(nèi)部的代碼替換所有對(duì)于指出的函數(shù)的調(diào)用。這樣做在兩個(gè)方面快于函數(shù)調(diào)用。這樣做在兩個(gè)方面快于函數(shù)調(diào)用:第一,省去了調(diào)用指令需要的執(zhí)行時(shí)間;第二,省去了傳遞變?cè)蛡鬟f過程需要的時(shí)間。但是使用這種方法在優(yōu)化程序速度的同時(shí),程序長(zhǎng)度變大了,因此需要更多的ROM。使用這種優(yōu)化在Inline函數(shù)頻繁調(diào)用并且只包含幾行代碼的時(shí)候是最有效的。
10、用指針代替數(shù)組。
在許多種情況下,可以用指針運(yùn)算代替數(shù)組索引,這樣做常常能產(chǎn)生又快又短的代碼。與數(shù)組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數(shù)組時(shí)差異更明顯。下面的代碼作用是相同的,但是效率不一樣。
數(shù)組索引 ??指針運(yùn)算 For(;;) { ? p=array??????A=array[t++];?for(;;) {a=*(p++);?...... ?????????????????????????????......??}
指針方法的優(yōu)點(diǎn)是,array的地址每次裝入地址p后,在每次循環(huán)中只需對(duì)p增量操作。在數(shù)組索引方法中,每次循環(huán)中都必須進(jìn)行基于t值求數(shù)組下標(biāo)的復(fù)雜運(yùn)算。
11、不定義不使用的返回值。
function函數(shù)定義并不知道函數(shù)返回值是否被使用,假如返回值從來不會(huì)被用到,應(yīng)該使用void來明確聲明函數(shù)不返回任何值。
12、手動(dòng)編寫匯編。
在嵌入式軟件開發(fā)中,一些軟件模塊最好用匯編語言來寫,這可以使程序更加有效。雖然C/C++編譯器對(duì)代碼進(jìn)行了優(yōu)化,但是適當(dāng)?shù)氖褂脙?nèi)聯(lián)匯編指令可以有效的提高整個(gè)系統(tǒng)運(yùn)行的效率。
13、使用寄存器變量。
在聲明局部變量的時(shí)候可以使用register關(guān)鍵字。這就使得編譯器把變量放入一個(gè)多用途的寄存器中,而不是在堆棧中,合理使用這種方法可以提高執(zhí)行速度。函數(shù)調(diào)用越是頻繁,越是可能提高代碼的速度。
14、使用增量和減量操作符。
在使用到加一和減一操作時(shí)盡量使用增量和減量操作符,因?yàn)樵隽糠Z句比賦值語句更快,原因在于對(duì)大多數(shù)CPU來說,對(duì)內(nèi)存字的增、減量操作不必明顯地使用取內(nèi)存和寫內(nèi)存的指令,比如下面這條語句:x=x+1;
?模仿大多數(shù)微機(jī)匯編語言為例,產(chǎn)生的代碼類似于:
move?A,x ;把x從內(nèi)存取出存入累加A
add?A,1?;累加器A加1?????
store?x??;把新值存回x?
如果使用增量操作符,生成的代碼下:
incr?x?;x加1?
顯然,不用取指令和存指令,增、減量操作執(zhí)行的速度加快,同時(shí)長(zhǎng)度也縮短了。
?
總結(jié)
以上是生活随笔為你收集整理的嵌入式编程C语言提高代码效率的14种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式ARM启动代码的工作
- 下一篇: 在malloc函数中为什么常用sizeo