談談

    技术2022-05-11  66

    變量是個很重要的東西,要搞得透徹些。

    變量用於存儲一定的數據,它可以分爲某種類型的變量和指向某種類型的變量,後者是個指針,就是指針變量。在32位的計算機中他永遠佔4個字節,指針都這樣。

    前者的類型很多,比如分爲整型變量、浮點型變量、字符型變量等等,其中整型變量又可分爲短整型、長整型、有符號的、無符號的等,沒种所佔的空間都不一樣,比如短整型的佔2個字節,長整型的佔4個字節,具體的情況讀者可查閲相關資料。

    變量按生存周期又可分爲全局變量和局部變量。

    全局變量在程序的任何一個地方都可以訪問,而局部變量值在聲明它的那個程序塊中可以訪問,不同的程序塊兒中可以有同名的局部變量,儘管同名但是它們確是兩個完全獨立的變量,而同一名字的全局變量只能有一個。如果全局變量和某処的局部變量同名,那麽此處引用的將是局部變量(局部覆蓋全局)。這都好理解。

    局部變量在其程序塊兒結束時即被銷毀——因爲他本來就是作局部之用,用用就算了,留著無益,所以用晚了就丟掉(即被銷毀)。比如我寫了個函數func,如下:

     

    int  func( int  my) {    int i;    ...}

     

    函數體中的i是個局部變量,那麽儅函數結束時也就是運行到“}”時,變量i就被銷毀。函數的參數也是局部變量,在上例中就是變量my,當然它也同樣在函數執行完畢時被銷毀。

    局部變量存放在棧中,從彙編的角度看它存放在堆棧段中(.stack)。

    棧在用完後就被彈掉了,這也是局部變量在當前代碼塊兒結束後即被銷毀的原因。

    全局變量存放在靜態數據區中,靜態數據區位于數據段(.data)中。

    故而它長期存在。

    注意:全局變量不存放在堆中。

    下面說一下“靜態變量”。在變量跟前冠以保留字static此變量即爲靜態變量,比如:static int var1;//聲明var1為靜態整型變量。靜態變量當然也分全局靜態變量和局部靜態變量,不過與前面不同的是不論是全局靜態變量還是局部靜態變量,它們都存儲在靜態數據區中,這跟全局變量一樣。全局靜態變量使全局變量,局部靜態變量是局部變量這點沒錯。

    好了,說了這麽多,我們現在來談一個應用:我要存一個數,比如整數444吧,這個數我只打算用一下,用完了就想把它釋放掉以節約内存,怎麽辦?

    首先想想肯定不能使用全局變量,因爲全局變量一直貫穿整個程序(同時告訴你使用全局變量是個不好的習慣),它它當然不省資源。也不能使用靜態變量,因爲靜態變量跟全局變量一樣都放在靜態數據區中,放在那兒的東西都是貫穿整個程序的。於是那麽就只能使用局部變量了——存儲在棧中的那種。棧在用完了就被彈掉了,也就是放了内它的存空間。這很好,比如寫成如下代碼:

    ...... {    int my = 444;    //使用變量my的語句    ......}

    在運行到“}”時局部變量my即被銷毀。

    一切都運作得很好。不過仔細想想,這樣做還是有個小問題,或許你倒不認爲這有什麽了不起。問題是局部變量未必能及時銷毀,也就是說它可能銷毀的不夠快,在每它什麽事兒後老半天還不完蛋,佔用了我們有限的資源。這種情況是完全可能的。比如設想一個函數它的參數是一個老大的數組(實參),而這個函數僅在函數開頭“稍稍”使用了一下這個參數,以後的很多代碼都是進行複雜的計算,那麽在這種情況下也得等函數運行完畢時才能釋放那個大數組,造成了資源的浪費。


    最新回复(0)