程式設計師面試寶典 C C 記憶體分類

2021-08-15 10:03:21 字數 2433 閱讀 3131

在進行c/c++程式設計時, 需要程式設計師對記憶體的了解比較精準。 經常需要操作的記憶體可分為以下幾個類別。

● 棧區( stack) : 由編譯器自動分配和釋放, 存放函式的引數值、 區域性變數的值等。

其操作方式類似於資料結構中的棧。

● 堆區( heap) : 一般由程式設計師分配和釋放, 若程式設計師不釋放, 程式節束時可能由操

作系統**。 注意它與資料結構中的堆是兩回事, 分配方式倒是類似於鍊錶。

● 全域性區( 靜態區) ( static) : 全域性變數和靜態變數的儲存是放在一塊的, 初始化的

全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一

塊區域。 程式節束後由系統釋放。

● 文字常量區: 常量字串就是放在這裡的。 程式節束後由系統釋放。

● 程式**區: 存放函式體的二進位制**。

以下是一段實際說明的程式**:

int a = 0; //全域性初始化區

char *p1; //全域性未初始化區

main()

1. 申請方式

棧: 由系統自動分配。 例如, 宣告在函式中的乙個區域性變數int b, 系統自動在棧中為b

開闢空間。

堆: 需要程式設計師自己申請, 並指明大小, 在c中用malloc函式。

如:

p1 = (char *)malloc(10);
在c++中用new運算子, 如:

int *p2 = new

int(10);

但是注意p1、 p2本身是在棧中的。

2. 申請後系統的響應

棧: 只要棧的剩餘空間大於所申請空間, 系統將為程式提供記憶體, 否則將報異常提示棧

溢位。

堆: 首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶, 當系統收到程式的申請

時, 會遍歷該鍊錶, 尋找第乙個空間大於所申請空間的堆節點, 然後將該節點從空閒節點鏈

表中刪除, 並將該節點的空間分配給程式。 對於大多數系統, 會在這塊記憶體空間中的首位址

處記錄本次分配的大小, 這樣, **中的delete語句才能正確地釋放本記憶體空間。 另外, 由

於找到的堆節點的大小不一定正好等於申請的大小, 系統會自動地將多餘的那部分重新放入

空閒鍊錶中。

3. 申請大小的限制

棧: 在windows下, 棧是向低位址擴充套件的資料結構, 是一塊連續的記憶體的區域。

這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,

在windows下, 棧的大小是2mb( 也有的說是1mb, 總之是乙個編譯時就確定的常數) ,

如果申請的空間超過棧的剩餘空間, 將提示overflow。 因此, 能從棧獲得的空間較小。

堆: 堆是向高位址擴充套件的資料結構, 是不連續的記憶體區域。 這是由於系統是用鍊錶儲存

空閒記憶體位址的, 自然是不連續的。 而鍊錶的遍歷方向是由低位址向高位址, 堆的大小受限

於計算機系統中有效的虛擬記憶體。 由此可見, 堆獲得的空間比較靈活, 也比較大。

4. 申請效率的比較

棧: 由系統自動分配, 速度較快。 但程式設計師無法控制。

堆: 是由new分配的記憶體, 一般速度比較慢, 而且容易產生記憶體碎片, 不過用起來最方

便。 另外, 在windows下, 最好的方式是用virtualalloc分配記憶體。 不是在堆, 也不是在棧,

而是直接在程序的位址空間中保留一塊記憶體, 雖然用起來最不方便, 但是速度最快, 也最靈

活。5. 堆和棧中的儲存內容

棧: 在函式呼叫時, 第乙個進棧的是主函式中的下一條指令( 函式呼叫語句的下一條可

執行語句) 的位址, 然後是函式的各個引數。 在大多數的c編譯器中, 引數是由右往左入棧

的, 然後是函式中的區域性變數。 注意靜態變數是不入棧的。

當本次函式呼叫節束後, 區域性變數先出棧, 然後是引數, 最後棧頂指標指向最開始存的

位址, 也就是主函式中的下一條指令, 程式由該點繼續執行。

堆: 一般是在堆的頭部用乙個位元組存放堆的大小。 堆中的具體內容由程式設計師安排。

堆和棧的區別可以用如下的比喻來描述。

使用棧就像我們去飯館裡吃飯, 只管點菜( 發出申請) 、 付錢和吃( 使用) , 吃飽了就

走, 不必理會切菜、 洗菜等準備工作和洗碗、 刷鍋等掃尾工作。 好處是快捷, 但是自由度

小。 使用堆就像是自己動手做喜歡吃的菜餚, 比較麻煩, 但是比較符合自己的口味, 而且自

由度大。

資料結構方面的堆和棧, 這些都是不同的概念。 這裡的堆實際上指的就是( 滿足堆性質

的) 優先佇列的一種資料結構, 第乙個元素有最高的優先權; 棧實際上就是滿足先進後出的

性質的數學或資料結構。 雖然「堆疊」的說法是連起來叫, 但是它們還是有很大區別的。

C C 程式設計師面試寶典 2

9.關聯式資料庫的正規化 10.資料庫操作中的事務 事務的4個特性 11.數字矩陣的生成 對應的 如下 include include include define print arr2d arr,n else print arr2d arr,n 1 2 6 7 15 3 5 8 14 16 4 9...

程式設計師面試寶典

據統計,80 的簡歷都是不合格的。不少人事管理者抱怨收到的許多簡歷在格式上很糟糕。簡歷應該如何做到在格式上簡潔明瞭,重點突出?求職信應該如何有足夠的內容推銷自己?如何控制長度,言簡意賅?相信讀了本章你會對簡歷的撰寫有乙個新的認識。2.1 簡歷注意事項 1 簡歷不要太長 一般的簡歷普遍都太長。其實簡歷...

19 c c 程式設計師面試寶典 this指標

19.c c 程式設計師面試寶典 this指標 this指標是物件導向程式設計中的一項重要概念,在c 中,它表示當前執行的物件。在實現物件的方法時,可以使用this指標來獲得該物件自身的引用。面試題91 什麼是this指標 在乙個非靜態的成員裡面,this關鍵字就是乙個指標,指向該函式的這次呼叫所針...