利用編程語言的特性不但能簡化程序,而且還能提高程序的執行效率。先看一個使用sizeof()提高程序效率的例子程序,圖1是沒有使用sizeof()之前的代碼,其背景信息需要在此做一個交代。其中,alarm_string變量是定義為長度是255的char數組,而tail_msg定義的是一個指向字符串“,List NOT Complete”的指針。space是為了得到在alarm_string中除去tail_msg所指向字符串的長度後,有多少空間可以用來存放其它的內容,這是因為在某種情況下,需要將tail_msg所指向的字符串拷貝到alarm_string數組的末尾。另外,tail_msg所指向的字符串其內容是不會被更改的。
在圖1中,為了計算space的值,需要用到strlen()函數以得到tail_msg所指向字符串的長度,由於strlen()並不將字符串的結束符‘\0’計算在內,所以space的最後面還得減一。由於strlen()是一個函數,所以圖1的這短代碼在被執行時,strlen()也會每次都被調用,這顯然需要耗費一定的處理器時間,更好的方案如圖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所示。
在圖4中,只是在temp變量的最後加上一個初始化為零的斌值,當編譯器看到這段代碼時,會生成代碼對temp所指向的全部內存即64個字節)進行置零初始化。如此一來就省去了對memset()函數的調用,從而達到提高效率的目的。
顯然,要運用好編程語言的特性,需要對編程語言有更為深入的理解,而不能只是局限於一些入門書籍中所介紹的知識。盡管,運用編程語言的特性所帶來的效率接高對於現在強大的處理器而言可以忽略不計,但它更提體現了我們的專業性 —— 對於編程語言的娴熟駕馭!
本文出自 “至簡李雲” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/252954