日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

嵌入式编程C语言提高代码效率的14种方法

發(fā)布時(shí)間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式编程C语言提高代码效率的14种方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? ? ? ? ? 嵌入式編程C語(yǔ)言提高代碼效率的14種方法

?

1、在可能的情況下使用typedef替代define.當(dāng)然有時(shí)候你無(wú)法避免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è)邏輯條件語(yǔ)句中常數(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、使用無(wú)符號(hào)整數(shù),而不是整數(shù)的,如果你知道的值將永遠(yuǎn)是否定的。


有些處理器可以處理無(wú)符號(hào)的整數(shù),比有符號(hào)整數(shù)的運(yùn)算速度要快。(這也是很好的實(shí)踐,幫助self-documenting代碼)

6、switch-case語(yǔ)句。在程序中經(jīng)常會(huì)使用switch-case語(yǔ)句


每一個(gè)由機(jī)器語(yǔ)言實(shí)現(xiàn)的測(cè)試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么,就浪費(fèi)了處理器時(shí)間。為了提高速度,可以把具體的情況按照它們發(fā)生的相對(duì)頻率排序。即把最可能發(fā)生的情況放在第一,最不可能發(fā)生的情況放在最后,這樣會(huì)減少平均的代碼執(zhí)行時(shí)間。當(dāng)switch語(yǔ)句中的case標(biāo)號(hào)很多時(shí),為了減少比較的次數(shù),明智的做法是把大switch語(yǔ)句轉(zhuǎn)為嵌套switch語(yǔ)句。把發(fā)生頻率高的case標(biāo)號(hào)放在一個(gè)switch語(yǔ)句中,并且是嵌套switch語(yǔ)句的最外層,發(fā)生相對(duì)頻率相對(duì)低的case標(biāo)號(hào)放在另一個(gè)switch語(yǔ)句中。比如,下面的程序段把相對(duì)發(fā)生頻率低的情況放在缺省的case標(biāo)號(hào)內(nèi)。

pMsg=ReceiveMessage(); switch (pMsg->type) { case?FREQUENT_MSG1: handleFrequentMsg(); break;case?FREQUENT_MSG2: handleFrequentMsg2(); break;......case?FREQUENT_MSGn: handleFrequentMsgn(); break;default: //嵌套部分用來(lái)處理不經(jīng)常發(fā)生的消息switch?(pMsg->type){ case?INFREQUENT_MSG1: handleInfrequentMsg1(); break;case?INFREQUENT_MSG2: handleInfrequentMsg2(); break ;......case?INFREQUENT_MSGm: handleInfrequentMsgm(); break; } }

如果switch中每一種情況下都有很多的工作要做,那么把整個(gè)switch語(yǔ)句用一個(gè)指向函數(shù)指針的表來(lái)替換會(huì)更加有效,比如下面的switch語(yǔ)句,有三種情況:

enum?MsgType{Msg1,?Msg2,?Msg3} switch?(ReceiveMessage()) {case?Msg1;...... case?Msg2;..... case?Msg3;..... }為了提高執(zhí)行速度,用下面這段代碼來(lái)替換這個(gè)上面的switch語(yǔ)句/*準(zhǔn)備工作*/ int?handleMsg1(void); int?handleMsg2(void); int?handleMsg3(void);/*創(chuàng)建一個(gè)函數(shù)指針數(shù)組*/? int?(*MsgFunction?[])()={handleMsg1,?handleMsg2,?handleMsg3};/*用下面這行更有效的代碼來(lái)替換switch語(yǔ)句*/ 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)庫(kù)例程

因?yàn)楹芏啻蟮膸?kù)例程設(shè)法處理所有可能的情況,所以占用了龐大的內(nèi)存空間,因而應(yīng)盡可能地減少使用標(biāo)準(zhǔn)庫(kù)例程。

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過(guò)程需要的時(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ù)返回值是否被使用,假如返回值從來(lái)不會(huì)被用到,應(yīng)該使用void來(lái)明確聲明函數(shù)不返回任何值。


12、手動(dòng)編寫匯編。

在嵌入式軟件開發(fā)中,一些軟件模塊最好用匯編語(yǔ)言來(lái)寫,這可以使程序更加有效。雖然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(yǔ)句比賦值語(yǔ)句更快,原因在于對(duì)大多數(shù)CPU來(lái)說(shuō),對(duì)內(nèi)存字的增、減量操作不必明顯地使用取內(nèi)存和寫內(nèi)存的指令,比如下面這條語(yǔ)句:x=x+1;

?模仿大多數(shù)微機(jī)匯編語(yǔ)言為例,產(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99热免费在线观看 | 一区二区三区国产在线 | 里番acg★同人里番本子大全 | 久久久久人妻精品色欧美 | 午夜极品视频 | 涩涩涩在线视频 | 成人免费网站 | 中文字幕xxxx | 一区二区视频国产 | 131mm少妇做爰视频 | 怒海潜沙秦岭神树 | 91精品国产一区 | 亚洲免费网址 | 岛国大片在线免费观看 | 免费高清视频一区二区三区 | 精品黄色 | 欧美激情一级精品国产 | 四虎影院在线视频 | 欧美a∨ | 欧美日韩久久 | 欧美国产综合视频 | 久久久精品人妻一区二区三区色秀 | 久久影视网| 裸体黄色片 | 国产乱来 | 国产a视频免费观看 | 91看片黄 | 日韩欧美高清在线视频 | 欧美精品成人一区二区三区四区 | 一乃葵在线 | 国产精品嫩草69影院 | 2020国产精品 | 青草综合 | 老司机午夜剧场 | 欧美11p| 久伊人网 | 成人国产三级 | 国产精品免费无码 | 在线一区二区三区四区五区 | 男同互操gay射视频在线看 | 久久国产这里只有精品 | 激情五月激情综合 | 中文无码日韩欧 | 又粗又猛又爽又黄少妇视频网站 | tube国产麻豆 | 麻豆黄色网址 | 国产午夜小视频 | 国产成人一区二区三区 | av免费观看网站 | 97在线观看视频免费 | 国产精品久久久久9999爆乳 | 噜噜噜色| 污漫在线观看 | 五月天一区二区三区 | 国产精品果冻传媒潘 | 亚洲精品久久久久久久久久吃药 | 欧美精品二区三区四区免费看视频 | 黑人玩弄人妻一区二区三区 | 日韩黄网| 激情福利在线 | 日本美女啪啪 | 国产不卡a| 久久久久香蕉 | 日韩中文久久 | 国产精品美女久久久久久久 | 国产精品玖玖玖 | 成色视频| 一级片美女 | 欧美日韩人妻精品一区二区 | 国产成人h | 日本真人做爰免费视频120秒 | 天堂中文在线观看 | 四虎com| 欧美日韩中文字幕在线 | 香港三级网站 | www.youjizz.com日本 | 久草免费av| 成年人黄色免费视频 | 国产伦精品一区二区三区妓女 | 午夜天堂在线观看 | 玖色视频 | 少妇视频 | 亚洲50p | 黑人极品ⅴideos精品欧美棵 | 米奇影视第四色 | 久久久精品人妻无码专区 | 久久精品国产亚洲av无码娇色 | 亚洲精品久久久久久国产精华液 | 亚洲视频观看 | 男人捅爽女人 | 黄色av免费看 | 亚洲一区二区观看播放 | 国产精品88久久久久久妇女 | 色噜噜在线观看 | www.伊人网| 欧美一区二区三区免 | 五月天国产精品 | 亚洲国产精品久久人人爱 | 西西午夜|