編寫高效簡潔的C 語言代碼,是許多軟件工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述。
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1 招--以空間換時間。
C語言高效編程之以空間換時間例如:字符串的賦值。
方法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)
{
return ((IU<<(bw##_bf))-1)<<(bs##_bf);
}
void SET_BITS(int_dst,int_bf,int_val)
{
_dst=((_dst) & ~ (BIT_MASK(_bf)))I
(((_val)<<<(bs##_bf))&(BIT_MASK(_bf)))
}
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumb
er);
方法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 方法是其變體,其中滋味還需大家仔細體會。