當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語言初始化效率問題以及關(guān)鍵字解釋
一、初始化效率
1、在靜態(tài)變量的初始化中,我們可以把可執(zhí)行程序文件想要初始化的值放在當(dāng)程序執(zhí)行時(shí)變量將會(huì)使用的位置。當(dāng)可執(zhí)行文件載入到內(nèi)存時(shí),這個(gè)已經(jīng)保存了正確初始值的位置將賦值給那個(gè)變量,完成這個(gè)任務(wù)并不需要額外的時(shí)間,也不需要額外的指令,變量將會(huì)得到正確的值、
2、自動(dòng)變量當(dāng)程序鏈接時(shí)還無法判斷自動(dòng)變量的存儲(chǔ)位置。事實(shí)上,函數(shù)的局部變量在函數(shù)的每次調(diào)用中可能占據(jù)不同的位置。基于這個(gè)理由,自動(dòng)變量沒有缺省的初始值,而顯示的初始化將在代碼塊的其實(shí)出插入一條隱式的賦值語句。
一句話總結(jié);局部變量的初始化與分開寫毫無區(qū)別
即什么時(shí)候使用變量什么時(shí)候聲明,盡量重用,不要讓他隱式初始化,浪費(fèi)內(nèi)存
static 關(guān)鍵字的修飾。
當(dāng)它用于函數(shù)定義時(shí),或用于代碼塊之外的變量聲明時(shí),static關(guān)鍵字用于修改標(biāo)識符的鏈接屬性,從external改為internal,但標(biāo)識符的存儲(chǔ)類型和作用域不受影響。用這種方式聲明的函數(shù)或變量只能在聲明他們的源文件中訪問。
總結(jié):
一下以文件解釋
int a;
//a 變量存儲(chǔ)在靜態(tài)內(nèi)存
特點(diǎn):
在程序運(yùn)行之前創(chuàng)建
可以被其他的C文件訪問以及它的下方函數(shù)使用
初始化值為0
=================
static int a;
特點(diǎn):在程序運(yùn)行之前存在
靜態(tài)內(nèi)存存儲(chǔ)
不能被其他文件訪問
================
代碼塊中的變量
static int a ;
靜態(tài)變量
與int a ;(局部變量)
的區(qū)別是:
一個(gè)存儲(chǔ)在靜態(tài)內(nèi)存 也就是普通內(nèi)存
另一個(gè)是局部變量,也就是運(yùn)行時(shí)堆棧
函數(shù)上添加static的話:
不能被其他的文件訪問該函數(shù)
幾個(gè)關(guān)鍵字的處理
static 靜態(tài)內(nèi)存
auto 運(yùn)行時(shí)堆棧
register 硬件寄存器
external 引用外部文件變量函數(shù)
internal 引用內(nèi)部文件變量函數(shù)
=======================
關(guān)于代碼塊變量被static修飾
保證該函數(shù)多次調(diào)用時(shí),我們?yōu)榱朔乐乖撟兞坎蛔?/p>
進(jìn)行的處理比如我們進(jìn)行了多次的調(diào)用
二、關(guān)鍵字解釋
變量的存儲(chǔ)類型(storage class )是指存儲(chǔ)變量值的內(nèi)存類型。變量的存儲(chǔ)類型決定變量何時(shí)創(chuàng)建、何時(shí)銷毀以及它的值將保持多久。有三個(gè)地方可以用于存儲(chǔ)變量:普通內(nèi)存、運(yùn)行時(shí)堆棧、硬件寄存器。在這三個(gè)地方存儲(chǔ)的變量具有不同的特性。
變量的缺省存儲(chǔ)類型取決于它的聲明位置。凡是在任何代碼塊之外聲明的變量總是存儲(chǔ)于靜態(tài)內(nèi)存中,也就是不屬于堆棧的內(nèi)存,這類變量成為靜態(tài)變量。對于這類變量,你無法為他們制定其他存儲(chǔ)類型。
靜態(tài)變量在程序運(yùn)行之前創(chuàng)建,在程序的整個(gè)執(zhí)行期間始終存在。它始終保持原先的值,除非給它賦一個(gè)不同的值或者程序結(jié)束。
在代碼塊內(nèi)部聲明的變量的缺省存儲(chǔ)類型是自動(dòng)的(automatic),也就是說他存儲(chǔ)于堆棧中,成為自動(dòng)變量。有一個(gè)關(guān)鍵字auto就是用修飾這種存儲(chǔ)類型的,但它極少使用,因?yàn)榇a塊中的變量在缺省情況下就是自動(dòng)變量在程序執(zhí)行到聲明自動(dòng)變量的代碼塊時(shí),自動(dòng)變量才被創(chuàng)建,當(dāng)程序的執(zhí)行流離開該代碼時(shí),這些自動(dòng)變量便自行銷毀。如果該代碼塊被數(shù)次執(zhí)行,例如一個(gè)函數(shù)被反復(fù)調(diào)用,這些自動(dòng)變量每次都將重新創(chuàng)建。在代碼塊再次執(zhí)行時(shí),這些自動(dòng)變量在堆棧中所占據(jù)的內(nèi)存位置有可能和原先的位置相同,也可能不同。及時(shí)他們所占據(jù)的位置相同,你也不能保證這塊呢村同時(shí)不會(huì)有其他的用途,因此,我們可以說自動(dòng)變量在代碼塊執(zhí)行完畢后就消失。當(dāng)代碼塊再次執(zhí)行時(shí),他們的值一般并不是上次執(zhí)行時(shí)的值。
對于在代碼塊內(nèi)部聲明的變量,如果給它加上關(guān)鍵字static,可以使他的存儲(chǔ)類型從自動(dòng)變?yōu)殪o態(tài)。具有靜態(tài)存儲(chǔ)類型的變量在整個(gè)程序執(zhí)行過程中一直存在,而不僅僅在聲明它的代碼塊的執(zhí)行時(shí)存在。注意,修改變量的存儲(chǔ)類型并不標(biāo)示修改該變量的作用域,它任然只能在該代碼塊內(nèi)部按名字訪問。函數(shù)的形式參數(shù)不能聲明
后,關(guān)鍵字register可以用于自動(dòng)變量的聲明,提示他們應(yīng)該存儲(chǔ)于機(jī)器的硬件寄存器而不是內(nèi)存中,這類變量稱為寄存器變量。通常,寄存器變量比存儲(chǔ)于內(nèi)存的變量訪問起來效率更高。但是,編譯器并不一定要理財(cái)register關(guān)鍵字,如果有太多的變量被聲明為register,它只選取前幾個(gè)實(shí)際存儲(chǔ)于寄存器中,其余的就按普通自動(dòng)比那輛處理。如果一個(gè)編譯器自己具有一套寄存器優(yōu)化方法,它可能忽略register關(guān)鍵字,
使用:使用說明,為了加快程序的編譯速度,你希望把使用頻率高的那些變量聲明為寄存器變量,在有些計(jì)算機(jī)中,如果你把指針聲明為寄存器變量,程序的效率將能得到提高,有其是那些頻繁的執(zhí)行間接訪問操作的指針,你可以把函數(shù)的形式參數(shù)聲明為寄存器變量,編譯器會(huì)在函數(shù)的起始位置生成指令,把這些值從堆棧復(fù)制到寄存器中。但是,完全有可能,這個(gè)優(yōu)化措施所節(jié)省的時(shí)間和控件的開銷還抵不上復(fù)制這幾個(gè)值所用的開銷。
寄存器變量的創(chuàng)建和銷毀時(shí)間和自動(dòng)變量相同,但它需要一些額外的工作。在一個(gè)使用寄存器變量的函數(shù)返回之前,這些寄存器先前存儲(chǔ)的值必須恢復(fù),確保調(diào)用者的寄存器變量未被破壞。許多機(jī)器使用運(yùn)行時(shí)堆棧來完成這個(gè)任務(wù)。當(dāng)函數(shù)開始執(zhí)行時(shí),它把需要使用的所有寄存器的內(nèi)容都保存到堆棧中,當(dāng)函數(shù)返回時(shí),這些值再復(fù)制回寄存器中。在許多機(jī)器的硬件實(shí)現(xiàn)中,并不為寄存器指定的地址。同樣由于寄存器值的保存和恢復(fù)某一個(gè)特定的寄存器在不同的時(shí)刻所保存的值不一定相同。基于這些理由,機(jī)器并不像你提供寄存器變量的地址。