程式設計好習慣 利用程式語言特性提高程式執行效率

2021-09-05 02:07:18 字數 2051 閱讀 3594

利用程式語言的特性不但能簡化程式,而且還能提高程式的執行效率。先看乙個使用sizeof()提高程式效率的例子程式,圖1是沒有使用sizeof()之前的**,其背景資訊需要在此做乙個交代。其中,alarm_string變數是定義為長度是255的char陣列,而tail_msg定義的是乙個指向字串「,list not complete」的指標。space是為了得到在alarm_string中除去tail_msg所指向字串的長度後,有多少空間可以用來存放其它的內容,這是因為在某種情況下,需要將tail_msg所指向的字串拷貝到alarm_string陣列的末尾。另外,tail_msg所指向的字串其內容是不會被更改的。

example.c

00070: #define max_string_txt         255

00071: char alarm_string [max_string_txt];

00072:

00073: char *tail_msg = ", list not complete";

00074: char space = max_string_txt - strlen (tail_msg) - 1; 圖1

在圖1中,為了計算space的值,需要用到strlen()函式以得到tail_msg所指向字串的長度,由於strlen()並不將字串的結束符『\0』計算在內,所以space的最後面還得減一。由於strlen()是乙個函式,所以圖1的這短**在被執行時,strlen()也會每次都被呼叫,這顯然需要耗費一定的處理器時間,更好的方案如圖2所示。

example.c

00070: #define max_string_txt         255

00071: char alarm_string [max_string_txt];

00072:

00073: static const char tail_msg = ", list not complete";

00074: char space = max_string_txt -

sizeof (tail_msg);

圖2圖2中將tail_msg定義為乙個靜態陣列,且在space變數的計算中使用sizeof()進行替代,注意sizeof()會將字串的結束符『\0』計算在內。由於sizeof()的值是在編譯時就決定了的,也就是說,對於這裡的例子,編譯器在編譯時就會計算出sizeof(tail_msg)的值應當是20,因此,space在執行時將會被直接斌值為235,而不存在任何的函式呼叫和數**算。另外,還需要注意tail_msg需要定義為static和const,否則編譯器會生成一段**,每次這段程式被執行時都會對位於棧上的tail_msg陣列進行初始化。將tail_msg定義為static和const就會造成其記憶體分配在.rodata段(參見《

程式中的段

》)上,而不是棧上,從而避免多次的初始化操作。

下面再看另乙個使用程式語言特性的例子,原始的例子如圖3所示。在143行呼叫memset()對區域性陣列變數temp進行置零初始化,顯然,由於memset()函式的存在,這段**每次執行時都得進行memset()函式呼叫,更好的解決方案如圖4所示。

example.c

00141: #define max_msk_octet_len         64

00142: char temp[max_msk_octet_len];

00143: memset(temp, 0, sizeof(temp)); 圖3

在圖4中,只是在temp變數的最後加上乙個初始化為零的斌值,當編譯器看到這段**時,會生成**對temp所指向的全部記憶體(即64個位元組)進行置零初始化。如此一來就省去了對memset()函式的呼叫,從而達到提高效率的目的。

example.c

00141: #define max_msk_octet_len         64

00142: char temp[max_msk_octet_len] = ;

圖4顯然,要運用好程式語言的特性,需要對程式語言有更為深入的理解,而不能只是侷限於一些入門書籍中所介紹的知識。儘管,運用程式語言的特性所帶來的效率接高對於現在強大的處理器而言可以忽略不計,但它更提體現了我們的專業性 —— 對於程式語言的嫻熟駕馭!

程式設計好習慣

我們在編碼的時候總是希望能寫出風格良好,清晰 健壯的程式,把 當成一件藝術品來看待 來雕琢,讓 coding成為一種藝術。看了很多大牛關於程式設計風格與修養方面的文章,很受啟發,結合自己體會,簡錄幾條,提醒自己時刻注意。1.引數檢查 對於有引數的函式,首先要對引數的合法性進行檢查。可以利用asser...

程式設計好習慣

1.dry 不要重複你自己 don t repeat yourself dry是一條最容易理解但又是相對比較難以應用的原則。它是指當你在兩處或者更多的地方發現相似 時,我們應當把它們抽象成乙個新的函式,在之前重複的地方呼叫新的函式並帶上適當的引數。dry也許是最普遍的一條程式設計原則,我從未發現乙個...

C 程式設計好習慣

1.不要在建構函式中做初始化操作 要求類 尤其是對外介面類 提供init 函式,在該函式中進行相關初始化操作,初始化失敗能夠返回錯誤碼。可以規避問題 建構函式中難以返回錯誤碼,外部呼叫者無從判斷初始化結果。當該類作為全域性變數使用時,構造函式呼叫發生在main 函式執行之前,出現問題難以追蹤。2.所...