當前位置:編程學習大全網 - 編程語言 - 能給我講講堆和棧嗎?

能給我講講堆和棧嗎?

堆和棧的區別

壹般認為C分為這些存儲區。

1堆棧-由編譯器自動分配和釋放

2 heap——壹般由程序員釋放,如果程序員不釋放,程序最後可能會被OS回收。

3全局區(靜態區),全局變量和靜態變量的存儲放在壹起,初始化的全局變量和靜態變量放在壹起。

狀態變量在壹個區域,未初始化的全局變量和未初始化的靜態變量在另壹個相鄰的區域。

-在計劃結束時發布

還有壹個專門放常量的地方。-在計劃結束時發布

函數體中定義的變量通常在堆棧上,內存由malloc、calloc、realloc等函數分配。

妳應得的在那堆上。全局數量是在所有函數之外定義的,不管它在添加靜態修飾符之後的位置。

存儲在全局區(靜態區),在所有函數之外定義的靜態變量在這個文件中是有效的。

不能extern到其他文件,函數體中定義的靜態表示只在函數體中有效。此外,

函數中的字符串“adgfdf”存儲在常量區。

例如:

int a = 0;全局初始化區

char * p 1;全局未初始化區域

主()

{

int b;棚

char s[]= " ABC ";棚

char * p2棚

char * P3 = " 123456 ";123456\0在常量區,p3在堆棧上。

靜態int c = 0;全局(靜態)初始化區

p 1 =(char *)malloc(10);

p2 =(char *)malloc(20);

10和20字節的分配區在堆區。

strcpy(p1," 123456 ");123456\0放在常量區,編譯器可能會將其與p3指向的“12345”進行比較。

6英寸優化成壹體。

}

還有壹系列的操作,在調用函數的時候保存場景,在堆棧上傳遞參數。

堆棧的空間大小是有限的,vc默認為2M。堆棧不夠用的情況通常是大量的數組和

遞歸函數級別太深。要知道當壹個函數從調用中返回時,它會釋放所有的函數,這壹點很重要。

的堆棧空間。堆棧是由編譯器自動管理的,所以不用擔心。

堆動態分配內存,妳可以分配很多內存。但是用不好會造成內存泄露。

而且頻繁的malloc和free會產生內存碎片(有點類似於磁盤碎片),因為C分配動態內存的時候,

就是找到匹配的記憶。使用堆棧不會產生碎片。

訪問堆棧上的數據比通過指針訪問堆棧上的數據要快。

壹般來說,棧和棧是壹樣的,就是棧,但是棧就是堆。

堆棧先入後出,壹般從高地址到低地址增長。

堆和棧是C/C++編程不可避免會遇到的兩個基本概念。首先,這兩個概念

可以在有關數據結構的書籍中找到,都是基本的數據結構,雖然棧比較簡單。

在具體的C/C++編程框架中,這兩個概念並不是並行的。對底層機器代碼的研究可以揭示

,棧是機器系統提供的數據結構,堆是C/C++函數庫提供的。

具體來說,現代計算機(串行執行機制)直接支持代碼底層堆棧的數據結構。這反映了

現在有專門的寄存器指向堆棧所在的地址,有專門的機器指令完成數據進出堆棧的操作。

這種機制的特點是效率高,支持的數據有限,壹般由整數、指針、浮點數等系統直接支持。

由保存的數據類型不直接支持其他數據結構。由於堆棧的這壹特性,在程序中使用堆棧

非常頻繁。調用子例程是通過使用堆棧直接完成的。機器的呼叫指令意味著

將返回地址推入堆棧,然後跳轉到子例程地址的操作,而子例程中的ret指令是從堆棧中隱含的。

彈出回郵地址並跳轉的操作。C/C++中的自動變量就是直接使用堆棧的例子,這就是原因。

函數返回時,函數的自動變量自動失效的原因(因為手指的變化意味著處於黑暗狀態)。

與堆棧不同,堆的數據結構不受系統(無論是機器系統還是操作系統)的支持,而是由。

由函數庫提供。基本的malloc/realloc/free函數維護壹組內部堆數據結構。當程序

當使用這些函數獲取新的內存空間時,這組函數首先試圖從內部堆中找到可用的內存空間。

突然,如果沒有可用的內存空間,我們試圖通過使用系統調用來動態增加程序數據段的內存。

大小,新分配的空間首先被組織到內部堆中,然後以適當的形式返回給調用者。

。當程序釋放分配的內存空間時,這個內存空間被返回到內部堆結構,並可能被正確地

處理(例如,與其他空閑空間合並成更大的空閑空間)以更適合下壹個內存分配應用程序。這

壹個復雜的分配機制實際上相當於壹個內存分配緩沖池(Cache),如果要使用這個機制有以下幾種。

幹燥原因:

1.系統調用可能不支持任何大小的內存分配。壹些系統調用只支持固定大小及其。

多個內存請求(按頁分配);這樣會造成大量小內存分類的浪費。

2.申請內存的系統調用可能會很昂貴。系統調用可能涉及用戶模式和內核模式之間的轉換。

3.非托管內存分配在大量復雜的內存分配和釋放操作下,很容易導致內存碎片。

堆和棧的比較

從上面的知識可以看出,棧是系統提供的壹個功能,其特點是速度快,效率高,但是有局限性,數據不靈活。

;棧是函數庫提供的函數,特點是靈活方便,數據適應範圍廣,但效率有壹定程度的降低。

。堆棧是壹種系統數據結構,對於進程/線程是唯壹的。堆是函數庫的內部數據結構,不壹定唯壹。

。由不同堆分配的內存不能相互操作。堆棧空間可以分為靜態分配和動態分配。靜態分配就是編譯

翻譯器,如分配自動變量(auto)。動態分配由alloca函數完成。棧的動態分配

不需要釋放(是自動的),所以沒有釋放功能。為了程序的可移植性,棧的動態分配操作是

不鼓勵!堆空間的分配總是動態的,盡管所有的數據空間都將在程序結束時被釋放

系統,但是準確的應用程序內存/釋放內存匹配是壹個好程序的基本元素。

可以放壹塊思考。

堆和棧以相反的方向增長,

| - |低位地址

|堆|

| - |

| | |

|我|

| |

| ^ |

堆棧|高位地址

-

所以電腦裏的堆和棧經常放在壹起。

Nod壹般沒必要,不要動態創建。我討厭把new出來的東西當做局部變量,壹用就用。

刪除的做法。

理由

1.堆棧分配比堆分配更快,分配所有局部變量只需要壹條指令。

2.堆棧中不會有內存碎片。

3。堆棧對象易於管理。

當然,妳應該在某些情況下這樣寫,比如

1.這個物體非常大

2.需要在特定的時刻構建或分析對象。

3.類只允許動態創建對象,比如VCL的大多數類。

當然,當妳不得不使用堆對象時,妳也不能逃避。

/read.php?tid=1922。page=e

/.net/Articles/2006 05/80f 93200-6a0c-4e 21-82d 8-4212844 da 589 . html

  • 上一篇:mac的終端命令
  • 下一篇:計算機在語音識別中有什麽應用?
  • copyright 2024編程學習大全網