利用編程語言的特性不但能簡化程序,並且還能提升程序的執行效率。先看一個使用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()函數的調用,從而達到提升效率的目的。
ide
顯然,要運用好編程語言的特性,須要對編程語言有更爲深刻的理解,而不能只是侷限於一些入門書籍中所介紹的知識。儘管,運用編程語言的特性所帶來的效率接高對於如今強大的處理器而言能夠忽略不計,但它更提體現了咱們的專業性 —— 對於編程語言的嫺熟駕馭!
函數