第1招:以空間換時間
電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招--以空間換時間。
例如:字串的賦值。
方法a,通常的辦法:
#define len 32
char string1 [len];
memset (string1,0,len);
strcpy (string1,"this is an example!!")
方法b:
const char string2[len]="this is an example!"
char*cp;
cp=string2;
(使用的時候可以直接用指標來操作。)
從上面的例子可以看出,a 和b 的效率是不能比的。在同樣的儲存空間下,b 直接使用指標就可以操作了,而a 需要呼叫兩個字元函式才能完成。b 的缺點在於靈活性沒有a 好。在需要頻繁更改乙個字串內容的時候,a 具有更好的靈活性。
如果採用方法b,則需要預存許多字串,雖然占用了 大量的記憶體,但是獲得了程式執行的高效率。如果系統的實時性要求很高,記憶體還有一些,那我推薦你使用該招數。
該招數的邊招--使用巨集函式而不是函式。舉例如下:
方法c:
#define bwmcdr2_address 4
#define bsmcdr2_address 17
int bit_mask (int_bf)
void set_bits(int_dst,int_bf,int_val)
set_bits(mcdr2,mcdr2_address,registernumber);
方法d:
#define bwmcdr2_address 4
#define bsmcdr2_address 17
#define bmmcdr2_address bit_mask
(mcdr2_address)
#define bit_mask(_bf)(((1u<<(bw##_bf))-1)<<
(bs##_bf)
#define set_bits(_dst,_bf,_val)\
((_dst)=((_dst)&~(bit_mask(_bf)))i
(((_val)<<(bs##_bf))&(bit_mask(_bf))))
set_bits(mcdr2,mcdr2_address,registernumber);
函式和巨集函式的區別就在於,巨集函式占用了大量的空間,而函式占用了時間。大家要知道的是,函式呼叫是要使用系統的棧來儲存資料的,如果編譯器裡有棧檢查選項,一般在函式的頭會嵌入一些彙編語句對當前棧進行檢查;同時,cpu 也要在函式呼叫時儲存和恢復當前的現場,進行壓棧和彈棧操作,所以,函式呼叫需要一些cpu 時間。而巨集函式不存在這個問題。巨集函式僅僅作為預先寫好的**嵌入到當前程式,不會產生函式呼叫,所以僅僅是占用了空間,在頻繁呼叫同乙個巨集函式的時候,該現象尤其突出。d 方法是我看到的最好的置位操作函式,是arm 公司原始碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。c 方法是其變體,其中滋味還需大家仔細體會。
C語言高效程式設計的幾招(絕對實用,絕對經典)
非常感謝原文作者 第一招 以空間換時間 電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題 eg.字串的賦值 方法a 通常辦法 define len 32 char string1 len memset string1,0,len strcpy string1,...
基於ARM的高效C語言程式設計
arm處理器提高執行速度和減小 尺寸是嵌入式軟體設計的關鍵需求,以其高效能 低功耗 低成本等優勢被廣泛應用於各種成功的32位嵌入式系統中。儘管大多數的arm編譯器和偵錯程式都帶有效能優化工具,但是為了保證其正確性,編譯器必須是穩妥和安全的,而且它還受到處理器自身結構的限制。因此,程式設計人員必須在理...
C語言指標學多了,為什麼你會暈乎乎的?
對於c語言中的指標概念,如果我告訴你,它是乙個位址變數,你聽了一頭霧水,位址?啥意思?見你不理解,我說的詳細點 指標變數跟其他變數一樣,儲存的是乙個位址 你想了想,跟其他變數一樣?其他變數存放的是數值,變數有位址.指標變數存放的是位址,位址裡有個值.你又暈掉了!沒辦法,我找了專業教材,找到教材上對指...