C語言高效程式設計的四大祕技之以空間換時間
轉自:http://tech.163.com/06/1201/10/318HH45C00091KVA.html
引言:
編寫高效簡潔的C語言程式碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。
第1招:以空間換時間
計算機程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招——以空間換時間。
例如:字串的賦值。
方法A,通常的辦法:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,“This is a example!!”);
方法B:
const char string2[LEN] =“This is a 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 ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | \(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
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))) | \
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函式和巨集函式的區別就在於,巨集函式佔用了大量的空間,而函式佔用了時間。大家要知道的是,函式呼叫是要使用系統的棧來儲存資料的,如果編譯器裡有棧檢查選項,一般在函式的頭會嵌入一些彙編語句對當前棧進行檢查;同時,CPU也要在函式呼叫時儲存和恢復當前的現場,進行壓棧和彈棧操作,所以,函式呼叫需要一些CPU時間。而巨集函式不存在這個問題。巨集函式僅僅作為預先寫好的程式碼嵌入到當前程式,不會產生函式呼叫,所以僅僅是佔用了空間,在頻繁呼叫同一個巨集函式的時候,該現象尤其突出。 D方法是我看到的最好的置位操作函式,是ARM公司原始碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。
相關文章
- C語言高效程式設計的四大祕技之數學方法解決問題C語言程式設計
- C語言高效程式設計的四大祕技之使用位操作,減少除法和取模的運算C語言程式設計
- 大資料匯入之MySql設計之空間換時間的設計變更大資料MySql
- C語言兩結構體之間的成員互換C語言結構體
- C語言程式設計-現代方法 第二版 第2.4.4小節 計算箱子的空間重量C語言程式設計
- C 語言程式設計利器之 CLion程式設計
- 學程式設計C語言和Python之間有什麼不同?程式設計C語言Python
- 如何用最短的時間學會C語言,並掌握C語言的精髓所在?C語言
- C語言程式設計-現代方法 第二版 第2.5小節程式碼 計算箱子的空間重量改進版C語言程式設計
- OLAP 伺服器,空間換時間可行嗎?伺服器
- C++日期和時間程式設計總結C++程式設計
- 使用 Go 語言進行多時區時間轉換Go
- C語言程式設計之《資料輸出》C語言程式設計
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- c語言程式設計題C語言程式設計
- 掌握時間與空間:深入探討Golang中的時間戳與時區轉換Golang時間戳
- C語言:一種高效、易學的程式語言C語言
- 程式設計師相信的關於時間方面的謊言程式設計師
- 【揭祕】C語言型別轉換時發生了什麼?C語言型別
- UNDO表空間空間回收及切換
- Java之時間轉換Java
- 檢查交換空間: 可用的交換空間為 0 MB, 所需的交換空間為 150 MB。 未通過
- Java技術分享之函數語言程式設計!Java函數程式設計
- Java技術分享之函數語言程式設計Java函數程式設計
- 高效利用佇列的空間佇列
- 結對程式設計(c語言)程式設計C語言
- c++時間形式轉換C++
- C++中struct的空間計算C++Struct
- JavaScript計算兩個時間點之間的時間差JavaScript
- 優化三維空間定位法及C語言快捷實現優化C語言
- mysql時間與字串之間相互轉換MySql字串
- C++的函數語言程式設計C++函數程式設計
- 人工智慧能翻譯語言了:Facebook'TransCoder AI'在Java,Python和C ++之間轉換程式碼人工智慧AIJavaPython
- C語言:使用函式計算兩點間的距離C語言函式
- 坑系列 — 時間和空間的平衡
- Oracle臨時表空間檢視、新增臨時表空間資料檔案、修改預設臨時表空間 方法!Oracle
- GO語言————4.8 時間和日期Go
- 如何設計一個好玩的競技遊戲——戰略空間設計遊戲