2011-02-08 169 views
1

可能重複:
Stack,Static and Heap in C++內存分配

嗨,大家好,

目前我正在準備面試,往往我看到這樣的問題,其中有「靜態「變量或」本地「/」全局「變量存儲在哪裏,並且我完全不解。

我知道兩種內存:堆棧和堆。除此之外,是否還有其他類型的內存,其中存儲了不同類型的變量。在一些地方,我甚至讀了一些關於「數據段」的內容,但我不確定這些東西是如何映射到彼此的。任何人都可以提供任何鏈接/解釋給不同類型的內存,以及所有不同類型的變量存儲在何處,最好與C++相關。

感謝, 錢德爾

+2

堆棧和堆不是兩個_kinds_的內存。他們只是不同的組織。另外,維基百科對於學習這類東西非常有用,儘管通過編寫一個使用靜態變量和動態內存分配的程序來獲得C++書來保留知識可能會更好。 – aqua 2011-02-08 04:15:36

+3

查看此問題的接受答案:[Stack,Static and Heap in C++](http://stackoverflow.com/questions/408670/stack-static-and-heap-in-c) – 2011-02-08 04:17:37

回答

3

爲了簡化只是有點,基本上有三個主要的存儲區域,你需要去關注:

  1. 全局數據 - 外的一個靜態存儲位置堆棧或堆。這些變量被聲明爲不適用於任何函數的本地變量。 (C/C++「靜態」關鍵字所顯示的區別實際上只是程序的哪些部分知道全局變量的名稱。)

  2. 堆棧數據 - 動態,但用函數推入和彈出調用。

  3. 堆數據 - 由new/malloc返回的內容,真正是動態的,內存一直存在,直到刪除/釋放,而不是當函數退出時。

0

還有第三種存儲稱爲靜態。實質上,這是可執行文件的運行時內存映像中的數據項的存儲。它不能被分配或釋放,並且它的壽命本質上是程序的壽命。在C++中,類的靜態變量和全局變量一樣存儲在這個區域中。

在過去,一些處理器架構(特別是x86)使用分段尋址。在這種情況下,靜態數據將駐留在數據段中。爲了訪問靜態數據,您使用了相對於DS或ES寄存器中的段基址的地址。然而,至少從20世紀90年代中期開始,操作系統架構已經走向了一個平坦的內存模型,在這個模型中,所有的部分都是統一的並覆蓋整個內存空間。所以數據段不應該出現在當前的面試問題中。