电竞比分网-中国电竞赛事及体育赛事平台

分享

C++程序設(shè)計(jì)的存儲設(shè)計(jì)思想

 thchen0103 2017-04-16

程序中,在數(shù)據(jù)聲明中定義的變量和數(shù)組,它們存儲在靜態(tài)存儲區(qū)或者動(dòng)態(tài)存儲區(qū),其空間由系統(tǒng)負(fù)責(zé)分配,最終也由系統(tǒng)負(fù)責(zé)回收,分配時(shí)機(jī)和回收時(shí)機(jī)用戶無法控制。另外,它們都有自己的名字(因?yàn)槎x時(shí)有命名),程序中可以通過變量名或數(shù)組名訪問它們。

而“動(dòng)態(tài)分配”的變量或數(shù)組,分配時(shí)機(jī)和釋放時(shí)機(jī)可完全由程序員自己決定。另外,“動(dòng)態(tài)分配”的空間,由于沒有數(shù)據(jù)分明,因此這部分空間沒有名字,無法像使用變量或數(shù)組那樣通過變更名或數(shù)組名引用其中的數(shù)據(jù),只能通過指針變量來訪問。

對于數(shù)據(jù)在內(nèi)存中的存儲,C語言提供了3種策略,即靜態(tài)分配、自動(dòng)分配(棧式分配)和動(dòng)態(tài)分配。

1 靜態(tài)分配:靜態(tài)分配由編譯器自動(dòng)分配和釋放,在編譯時(shí)就確定了運(yùn)行時(shí)變量在內(nèi)存中的位置。這種性質(zhì)允許變量在整個(gè)程序的運(yùn)行過程中都不消失。在C語言中使用關(guān)鍵字static來定義靜態(tài)變量(可以是靜態(tài)局部變量、靜態(tài)全局變量或者在所有函數(shù)外面定義的全局變量)。

靜態(tài)存儲區(qū)是指存儲單元在程序運(yùn)行的整個(gè)過程中一直分配給某些變量,這些變量一直“靜靜地”占有這些單元,一直都不釋放,直到程序運(yùn)行結(jié)束。

2 自動(dòng)內(nèi)存分配(在棧上分配):自動(dòng)分配同樣也是由編譯器自動(dòng)分配和釋放,在編譯時(shí)并不確定變量在內(nèi)存中的位置,而是在調(diào)用函數(shù)時(shí)給變量分配空間,函數(shù)返回時(shí)釋放空間。C編譯器通過系統(tǒng)棧來管理這樣的變量。在C語言中,auto型變量是通過棧來管理的,不需要人為管理。

動(dòng)態(tài)存儲區(qū)是指存儲單元在程序運(yùn)行的不同時(shí)間可以分配不同的數(shù)據(jù)。需要時(shí)開辟單元,不需要時(shí)就釋放該單元。這樣某單元就可以在不同的時(shí)間分配給不同的變量,如函數(shù)里auto類型的局部變量就是這樣,調(diào)用函數(shù)時(shí),分配變量空間,退出函數(shù)時(shí)釋放該空間。再調(diào)用時(shí),再開辟...

3 動(dòng)態(tài)內(nèi)存分配(在堆上分配):動(dòng)態(tài)分配是指在程序運(yùn)行過程中動(dòng)態(tài)申請內(nèi)存的方法。這樣的內(nèi)存空間是從一個(gè)叫做堆的空間申請的,申請的空間是一段連續(xù)的內(nèi)存空間。不需要該內(nèi)存空間時(shí),應(yīng)該人為釋放它,否則會(huì)導(dǎo)致內(nèi)存資源的浪費(fèi)。

內(nèi)存中有一塊稱為“堆”(heap)的存儲區(qū),程序可以根據(jù)需要隨時(shí)用stdlib.h提供的malloc()等函數(shù)在堆中申請一部分空間來存儲數(shù)據(jù),當(dāng)不需要時(shí)又可以隨時(shí)用free()函數(shù)釋放。這種根據(jù)需要隨時(shí)開辟、隨時(shí)釋放的內(nèi)存分配方式,稱為動(dòng)態(tài)內(nèi)存分配。

C語言中malloc()大體的實(shí)現(xiàn)是,從操作系統(tǒng)一次性地取得比較大的內(nèi)存,然后將這些內(nèi)存“零售”給應(yīng)用程序。

堆區(qū)動(dòng)態(tài)內(nèi)存分配全局區(qū)靜態(tài)區(qū)棧區(qū)auto型變量(內(nèi)存重復(fù)使用)
常量(只讀)


代碼區(qū)(只讀)


(內(nèi)存分配中的堆和棧與數(shù)據(jù)結(jié)構(gòu)的堆和棧有本質(zhì)的區(qū)別。)

C語言的變量有兩種屬性:數(shù)據(jù)類型和存儲類型。存儲類型標(biāo)識符有:auto,extern,static,register。用來說明變量在計(jì)算機(jī)中不同的存儲形態(tài),包括存儲位置、作用域和生存期。

變量存儲類型作用域生存期
auto局部變量所定義函數(shù)內(nèi)部所定義函數(shù)運(yùn)行期間
全部變量所定義之處到本源文件結(jié)束程序運(yùn)行的整個(gè)過程
static局部變量所定義函數(shù)內(nèi)部程序運(yùn)行的整個(gè)過程
全部變量所定義之處到本源文件結(jié)束,限于本文件程序運(yùn)行的整個(gè)過程
register局部變量所定義函數(shù)內(nèi)部所定義函數(shù)運(yùn)行期間
extern全部變量所定義之處到本源文件結(jié)束程序運(yùn)行的整個(gè)過程

函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的實(shí)參是準(zhǔn)備好的具體數(shù)值,形參是函數(shù)調(diào)用時(shí)才開辟單元的變量。

在編寫程序時(shí),要告訴計(jì)算機(jī)這些數(shù)據(jù)的存儲位置。變量的存儲類型的功能之一就是確定該變量是存放在動(dòng)態(tài)數(shù)據(jù)區(qū)、靜態(tài)存放區(qū)還是寄存器中。

內(nèi)存區(qū)存儲的內(nèi)容

程序區(qū)程序代碼

靜態(tài)存儲區(qū)全局變量、靜態(tài)局部變量編譯階段初始化,且只賦值一次,對靜態(tài)局部變量多次調(diào)用時(shí),每次在前一次的結(jié)果上進(jìn)行。
動(dòng)態(tài)存儲區(qū)(棧區(qū))局部動(dòng)態(tài)變量、形參在進(jìn)入它們的函數(shù)或復(fù)合語句時(shí)才初始化,相當(dāng)于賦值語句。每調(diào)用一次,就重新賦值一次。
動(dòng)態(tài)分配區(qū)(棧區(qū))動(dòng)態(tài)數(shù)據(jù)程序運(yùn)行時(shí)與用戶交互完成。


(數(shù)據(jù)還可以存放在寄存器中)

數(shù)據(jù)存儲涉及的內(nèi)容:

要多少具體在哪里給誰用何時(shí)給用多久
數(shù)據(jù)類型數(shù)據(jù)地址作用域內(nèi)存分配生存期
字節(jié)數(shù)量變量名、指針作用的代碼范圍何時(shí)分配到何種內(nèi)存區(qū)域從單元開辟到釋放

磁盤文件是指存儲在外部介質(zhì)(硬盤、光盤或U盤)上的文件。 磁盤文件的輸入(外部存儲器上的磁盤文件→內(nèi)存)、輸出(內(nèi)存→外部存儲器上的磁盤文件)是外存與內(nèi)存的數(shù)據(jù)交互。

C++程序設(shè)計(jì)的存儲設(shè)計(jì)思想

C++程序設(shè)計(jì)的存儲設(shè)計(jì)思想

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多