欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于C++使用指針 堆和棧的區(qū)別分析

 更新時間:2013年04月19日 11:41:57   作者:  
本篇文章小編為大家介紹,關于C++使用指針 堆和棧的區(qū)別分析。需要的朋友參考下

數據在內存的存放有以下幾種形式

1.棧區(qū)--由編譯器自動分配并且釋放,該區(qū)域一般存放函數的參數值,局部變量的值等,
2.堆區(qū)--一般由程序員分配釋放,如果程序員不釋放,程序結束的時候才會被操作系統(tǒng)回收,
3.寄存器區(qū)--用來保存棧頂指針和指令指針
4.全局去--也是靜態(tài)區(qū),全局變量和靜態(tài)變量都是存儲在一起的,初始化的全局變量和靜態(tài)變量都存儲在一塊,為初始化的全局變量和靜態(tài)變量在相鄰的另一個區(qū)域,程序結束后由系統(tǒng)釋放。
5.文字常量區(qū)--常量字符串就是放在這里的,程序結束后由系統(tǒng)釋放,
6.程序代碼區(qū)--存放函數的二進制代碼。

函數參數和局部變量存放在棧中,函數運行結束或者返回系統(tǒng)就釋放了他們所占用的內存空間,但是全局變量不會被系統(tǒng)釋放掉。全局的只有在程序結束后才會被系統(tǒng)所釋放,而且由于全局變量被所有的類成員和函數所共享,很容易被修改,為了解決這一問題
我們會使用堆

堆棧的區(qū)別

1.申請方式的不同

堆是程序員自己申請
而棧則是有程序判斷局部變量或者函數 系統(tǒng)來自動分配

2.系統(tǒng)的響應不同

棧-只要棧的剩余空間大于所申請的空間,系統(tǒng)將為程序提供內存,否則將提示棧溢出 overflow

堆- 系統(tǒng)收到程序中申請的控件后,會遍歷一個操作系統(tǒng)用來記錄內存控件地址得鏈表,當找到一個空間大于所申請控件的堆結點后就會將該節(jié)點從記錄內存空閑地址的鏈表中刪除,并將結點的內存分配給程序,然后在這塊區(qū)域的首地址處記錄分配的大小,     這樣我們在使用delete來釋放內存的時候,delete才能正確的識別并刪除該內存區(qū)域的所有變量,另外我們申請的內存空間與堆結點上的內存空間不一定相等,這時候系統(tǒng)就會自動將堆結點上的多出來的一部分內存空間回收到空閑鏈表中

3、空間的大小不同

棧-在windows狀態(tài)下,棧是一塊連續(xù)的內存的區(qū)域,它的大小是2M,也有的說1M,總之這個數值是一編譯的時候就確定的常數,是由系統(tǒng)預先根據棧頂的地址和棧的最大容量定義好的,加入你的數據申請的內存空間超過棧的空間,就會提示overflow,所以別指望棧能夠存儲比較大的數據。

堆-堆是不連續(xù)的內存區(qū)域,各塊區(qū)域由鏈表將他們串起來,這些串聯起來的內存空間叫做堆,他的大小是由系統(tǒng)中虛擬的內存來定的,因此獲得的空間比較大,而且獲得空間的方式也比較靈活。

4.執(zhí)行效率的不同

棧-棧由系統(tǒng)自動分配,因此速度比較快,但是程序員不能對其進行操作。
堆-堆是程序員分配的內存,     一般速度比較慢,而且容易產生內存碎片,不過用起來很方便。

5.執(zhí)行函數的不同

棧-在函數調用的時候,第一個進棧的是被調用函數下一行的內存地址,其次是函數的參數,假如參數多余一個,那么次序是從左往右,最后才是函數的局部變量。

由于棧的先進后出原則,函數結束時正好相反,先是局部變量先出棧,然后是參數,次序是從左向右,這時所偶的變量都出棧,指針自然的第一個進棧的那行內存地址,也就是被調用函數的下一行內存地址,程序根據該地址跳轉到調用函數的下一行自動執(zhí)行。

由于棧的先進后出原則,所以他永遠不可能產生內存碎片

堆--堆是一大堆不連續(xù)的內存區(qū)域,在系統(tǒng)中由鏈表將他們串聯起來,因此在使用的時候必須由程序員來安排,他的機制是很復雜的,有時候為了分配一塊合適的內存,程序員需要按照一定的算法在堆內存中搜索可用的足夠大的空間,如果沒有滿足條件的空間,那么就要向內存中發(fā)出申請一部分內存空間,這樣才能有機會分配足夠大的內存,然后將計算后的數值返回,顯然堆的運行效率比棧低很多,而且容易產生碎片,但是好處是堆可以存儲相當的大的數據,并且一些細節(jié)可以由程序員來安排。

以上就是堆棧的區(qū)別 但是在應用中的取舍還是具體問題具體分析

相關文章

  • VScode如何調用KEIL-MDK

    VScode如何調用KEIL-MDK

    這篇文章主要介紹了VScode如何調用KEIL-MDK問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++右值引用與移動構造函數基礎與應用詳解

    C++右值引用與移動構造函數基礎與應用詳解

    左值和右值都是針對表達式,左值是指表達式結束后依然存在的持久對象,右值是指表達式結束時就不再存在的臨時對象,下面這篇文章主要給大家介紹了關于C++11右值引用和移動語義的相關資料,需要的朋友可以參考下
    2023-02-02
  • C++中各種初始化方式示例詳解

    C++中各種初始化方式示例詳解

    這篇文章主要給大家介紹了關于C++中各種初始化方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • C語言實現通訊錄系統(tǒng)程序

    C語言實現通訊錄系統(tǒng)程序

    這篇文章主要為大家詳細介紹了C語言實現通訊錄系統(tǒng)程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++中BitBlt的使用方法詳解

    C++中BitBlt的使用方法詳解

    這篇文章主要介紹了C++中BitBlt的使用方法詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Matlab實現鼠標光標變成愛心和瞄準鏡形狀

    Matlab實現鼠標光標變成愛心和瞄準鏡形狀

    這篇文章主要為大家詳細介紹了如何利用Matlab實現將鼠標光標變成愛心和瞄準鏡等形狀,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • C語言實現猜拳游戲

    C語言實現猜拳游戲

    這篇文章主要為大家詳細介紹了C語言實現猜拳游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言詳解select函數的使用

    C語言詳解select函數的使用

    C語言中select函數的使用?一般用connect、accept、recv或recvfrom這類函數,程序阻塞,直至該套接字上接受到數據后程序才能繼續(xù)運行。但是使用select函數可以實現非阻塞方式的程序
    2022-05-05
  • C語言 MD5的源碼實例詳解

    C語言 MD5的源碼實例詳解

    這篇文章主要介紹了C語言 MD5的源碼實例詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    這篇文章主要介紹了Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程,本文圖文并茂給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03

最新評論