靜態儲存,堆,棧的理解

2021-10-08 15:44:40 字數 919 閱讀 5797

:可以理解為為乙個瓶子,他遵循著先進後出的原則

:是一種經過排序的樹狀結構,每乙個節點都有乙個值,我們通常說的堆是二叉堆,堆的特點是跟節點最大或者最小,且子節點也是乙個堆,所以我們在使用的堆的時候,都是隨便取乙個節點,並沒有什麼順序

記憶體的基本概述

棧: 編譯器自動申請和自動釋放的區域,存放函式的引數值,和一些區域性變數,在windows 大小一般為1m,在linux下一般為8m

堆: 是由程式設計師手動申請和釋放,但是他與資料結構的堆還是有區別的,他的分配類似於鍊錶,大小接近4g

全域性區(靜態區):靜態變數和全域性變數是儲存在一起的,他會伴隨著程式結束才會被釋放,.data()存放的已經初始化的全域性變數,而.bss下存放的未被初始化的

文字常量區 :存放常量,如字串常量

程式**區 :存放程式的**,並且是唯讀的

詳解

上面的是乙個詳細的記憶體分布的圖,我們可以看到各個記憶體的存放方式

棧(stack) :是從高位址向位址延深的,他處於最高的地方,他一般用在儲存一些區域性變數,模組結束後就自動的銷毀,且他申請的空間是連續的,但是他的大小是有限的,只適合一小的變數

下面的就是堆,他是從低位址向高位址向低位址延深的,他是由程式設計師手動申請和釋放的,他的管理類似一條鍊錶,所以他的空間是不連續,過於頻繁的釋放和申請棧區變數,會產生大量的空間碎片,而導致程式執行緩慢

之後常量區(全部變數區),他會伴隨著程式結束才會被釋放

常量儲存區: 他存放的是不可被修改的常量,通常用在那些編譯期間就能確定大小的區域,並且他在程式執行期間是可見的

**段:存放的程式執行的**,其中**段和已經初始化的靜態變數在可執行檔案中,其實也放有一些常量

堆疊靜態儲存區

1 從靜態儲存區域分配 內存在程式編譯時就已經分配好,這塊內存在程式的整個執行期間都存在。速度快 不容易出錯,因為有系統會善後。例如全域性變數,static變數等。靜態變數分為區域性靜態變數和全域性靜態變數,注意區分,區域性靜態變數不是全域性變數 靜態全域性變數的作用域僅限於當前原始檔,靜態區域性變...

關於靜態儲存區域,堆,棧

有關動態物件建立 一般來說,編譯器將記憶體分為三部分 靜態儲存區域 棧 堆。靜態儲存區主要儲存 全域性變數和靜態變數,棧儲存呼叫函式相關的變數 位址等,堆儲存動態生成的變數,在c中是指由malloc,free運算產生釋放的儲存空間,在c 中 就是指new和delete運算子作用的儲存區域。1 靜態儲...

C 堆 棧 靜態儲存區

棧堆 靜態儲存區 生命週期 函式結束即釋放 new,malloc開闢,delete,free釋放 釋放前,一直存在 最長,程式退出才釋放 儲存型別 程式 區域性變數 new,malloc申請的空間,用於儲存資料 常量static 修飾的變數,用於儲存資料 大小vs2010預設1m vs2010,x3...