日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++内存分类

發(fā)布時間:2024/7/23 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++内存分类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 棧

存放的數(shù)據(jù):

局部變量,函數(shù)參數(shù),返回地址等。

默認(rèn)初始值:

無默認(rèn)初始值,為隨機(jī)值。

分配者:

有編譯器自動分配。

分配大小:

在程序開始后分配固定大小的棧空間,如果申請空間大于剩余棧空間,那么分配失敗。

生長方向:

棧空間的生長方向是從高地址向低地址生長,即后申請的變量的地址小于先申請的變量的地址。

溢出:

如果新申請的變量小于剩余棧空間(因?yàn)榉峙涫枪潭ǖ臈4笮?#xff09;,就會溢出。

特點(diǎn):

系統(tǒng)自動分配,申請效率高,但程序員無法控制。

是否連續(xù):

連續(xù)。

分配過程:

變量作用域:

局部作用域,它是自動對象(auto),在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷,其所占用的內(nèi)存也被收回。

2 堆

存放的數(shù)據(jù):

由程序員動態(tài)(在代碼中)申請的空間。

分配者:

由程序員申請,操作系統(tǒng)分配。

大小是否固定:

大小不是固定的,是由程序員決定每次申請空間的大小。

分配過程:

申請堆空間,堆在內(nèi)存中呈現(xiàn)的方式類似于鏈表(記錄空閑地址空間的鏈表),在鏈表上尋找第一個大于申請空間的節(jié)點(diǎn)分配給程序,將該節(jié)點(diǎn)從鏈表中刪除。大多數(shù)系統(tǒng)中該塊空間的首地址存放的是本次分配空間的大小。

在C中,可以使用malloc和calloc進(jìn)行申請,兩個函數(shù)都返回申請內(nèi)存的首地址。兩者的區(qū)別為:

  • 兩者參數(shù)個數(shù)不同:malloc只有一個參數(shù),即你要分配的字節(jié)數(shù),calloc有兩個參數(shù),一個為單元個數(shù),另一個為每個單元大小
  • 兩者初始化不同:malloc不對分配的空間進(jìn)行初始化,所以內(nèi)存中是隨機(jī)值。而calloc會將分配的空間初始化為0

溢出:

生長方向:

堆的生長方向?yàn)榈偷刂废蚋叩刂飞L。

回收:

程序員手動釋放,如果程序結(jié)束時申請的空間還未釋放,那么操作系統(tǒng)會自動將其回收。釋放后,該塊空間會被再次鏈接到鏈表上。在申請時,如果該節(jié)點(diǎn)還有剩余空間,也會將剩余空間連接到鏈表上。

默認(rèn)初始值:

特點(diǎn):

堆是由程序員主動申請,效率低,使用起來方便但是容易產(chǎn)生碎片。

是否連續(xù):

不連續(xù)。

3 全局/靜態(tài)存儲區(qū)

存放的數(shù)據(jù):

全局變量,靜態(tài)全局變量,靜態(tài)局部變量

由誰分配:

大小是否固定:

溢出:

生長方向:

回收:

程序結(jié)束之后操作系統(tǒng)自動將其釋放。

默認(rèn)初始值:

(記得時0,但是不確定)

特點(diǎn):

在C中分為.bss段和.data段,未初始化的放在.bss段中, 初始化的放在.data中,在C++中不再區(qū)分。

是否連續(xù):

分配過程:

變量作用域:

  • 全局變量的作用域是全局作用域,全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用?extern?關(guān)鍵字再次聲明這個全局變量。
  • 靜態(tài)全局變量具有文件作用域。它與全局變量的區(qū)別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被 static 關(guān)鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態(tài)全局變量,它們也是不同的變量。

  • 靜態(tài)局部變量具有局部作用域。它只被初始化一次,自從第一次被初始化直到程序運(yùn)行結(jié)束都一直存在,它和全局變量的區(qū)別在于全局變量對所有的函數(shù)都是可見的,而靜態(tài)局部變量只對定義自己的函數(shù)體始終可見。

注意,全局變量最好不要在頭文件中定義,除非能保證該頭文件只被包含一次。因?yàn)閕nclude頭文件是將頭文件代碼插入到引用位置,所以全局變量定義到頭文件會使得該變量被重復(fù)定義。

4 常量存儲區(qū)

存放的數(shù)據(jù):

存放的是常量,不允許修改

由誰分配:

大小是否固定:

溢出:

生長方向:

回收:

程序結(jié)束之后操作系統(tǒng)自動將其釋放。

默認(rèn)初始值:

特點(diǎn):

是否連續(xù):

分配過程:

變量作用域:

5 代碼區(qū)

存放的數(shù)據(jù):

存放代碼,不允許修改,但可以執(zhí)行。編譯后的二進(jìn)制文件存放在這里。

由誰分配:

大小是否固定:

溢出:

生長方向:

回收:

默認(rèn)初始值:

特點(diǎn):

是否連續(xù):

分配過程:

變量作用域:

總結(jié)

以上是生活随笔為你收集整理的C++内存分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。