衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++中的棧和堆區別

SwM2_ChinaAET ? 來源:未知 ? 作者:李倩 ? 2018-10-04 10:29 ? 次閱讀

一般來說,寫程序就是與數據打交道,在執行程序某一功能的時候,將該功能所需要的數據加載到內存中,然后在執行完畢的時候釋放掉該內存。

數據在內存中的存放方式有以下幾種:

(1)棧區——由編譯器自動分配并且釋放,該區域一般存放函數的參數值、局部變量的值等。

(2)堆區——由程序員分配釋放。

(3)寄存器區——用來保存棧頂指針和指令指針。

(4)全局區(靜態區)——全局變量和靜態變量的存儲是放在一塊的。

(5)文字常量區——放常量字符串的區域。

(6)程序代碼區——存放函數體的二進制代碼。

棧和堆的區別:

(1)內存申請方式上的不同

<1>棧:由系統自動分配。

<2>堆:由程序員自己申請,需要指明變量的大小。

(2)系統響應的不同

<1>棧:只要棧的剩余空間大于所申請空間,系統就為程序提供 內存,否則提示棧溢出。

<2>堆:系統收到程序申請空間的要求后,會遍歷一個操作系統,用于記錄內存空閑地址的鏈表,當找到一個空間大于所申請空間的堆結點后,就會就會將該結點從記錄內存空閑地址的鏈表中刪除。并將該結點的內存分配給程序,然后在這塊內存區域的首地址處記錄分配的大小,這樣在使用delete來釋放內存的時候,delete才能正確的識別并刪除該內存區域的所有變量。另外,申請的內存空間與堆結點上的內存空間不一定相等,這時系統就會自動將堆結點上多出來的那一部分內存空間回收到空閑鏈表中。

(3)空間大小的不同

<1>棧:在Windows下,棧是一塊連續的內存的區域,其大小數值是編譯時就確定的常數,是由系統預先根據棧頂的地址和棧的最大容量定義好的。如果你的數據申請的內存空間超過棧的空間,那么系統會提示棧溢出。因此,別指望棧能存儲比較大的數據。

<2>堆:堆是不連續的內存區域。各塊區域由鏈表將它們串聯起來。堆的上限是由系統中有效的虛擬內存來定的。因此獲得的空間比較大,而且獲得空間的方式也比較靈活。

(4)執行效率的不同

<1>棧:棧由系統自動分配,因此速度較快。

<2>堆:堆是由程序員分配的內存,速度一般比較慢,而且容易產生內存碎片。

(5)執行函數時的不同

<1>棧:在函數調用時,第一個進棧的是被調用函數下一行的內存地址;其次是函數的參數,假如參數多于一個,那么次序是從右往左;最后才是函數的局部變量。由于棧的先進后出原則,因此它永遠不可能產生內存碎片。

<2>堆:堆是一大堆不連續的內存區域,在系統中由鏈表串接起來。堆的運行效率比棧要低得多,而且也容易產生碎片。優點是堆可以存儲相當多的數據,并且一些細節可以由程序員安排。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    796

    瀏覽量

    41757
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73854
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49283

原文標題:【博文連載】C++中的“棧與堆”

文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    區別在哪

    以下引用網上資料 理解區別(1)區(stack):由編譯器自動分配和釋放,存放函數的參數值、局部變量的值等,其操作方式類似于數據結構
    發表于 08-11 09:18

    C語言單片機、、堆棧的區別是什么?

    C語言單片機、、堆棧的區別是什么?
    發表于 10-13 08:09

    單片機有什么區別

    M0一、空間的區別:(1)區(st
    發表于 11-22 06:23

    STM32區別是什么

    區別是什么?的空間是如何進行分配的?
    發表于 11-29 07:05

    區別是什么

    在回答完進程的虛擬地址空間布局之后(上一篇),面試官可能抓住深入展開。區別①管理方式:
    發表于 12-22 07:26

    STM32堆棧區劃分

    STM32堆棧區(一)一個由C/C++編譯的程序占用的內存分為以下幾個部分:區(stack):編譯器自動分配釋放,存放函數的參數值,局部變量的值等。操作方式類似于數據結構
    發表于 01-20 08:32

    單片機區別在哪

    的好處是快捷,但是自由度小使用就象是自己動手做喜歡吃的菜肴,比較麻煩但是比較符合自己的口味,而且自由度大一、c/C++內存分區:(1)區(stack):由編譯器自動分配和釋放存放函
    發表于 01-20 08:31

    明確區分,究竟有什么區別?

    這條短短的一句話就包含了,看到new,我們首先就應該想到,我們分配了一塊內存,那么指針p呢?他分配的是一塊內存,所以這句話的意思就是:在
    的頭像 發表于 04-09 09:45 ?4477次閱讀
    明確區分<b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>,<b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>究竟有什么<b class='flag-5'>區別</b>?

    一文看懂區別和聯系

    本文開始介紹了的要點以及對的對比進行了分析,其次闡述了的聯系,最后介紹了
    的頭像 發表于 04-11 09:50 ?4.2w次閱讀
    一文看懂<b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>的<b class='flag-5'>區別</b>和聯系

    C語言編程的“”和“”七大不同之處

    區別一直都是永恒的話題,為此我也查了很多的資料,以防自己的理解錯誤,而給他人造成理解偏差。 先從簡單的一個例子引出: void function(){ int *p = (
    發表于 01-04 14:14 ?850次閱讀
    <b class='flag-5'>C</b>語言編程<b class='flag-5'>中</b>的“<b class='flag-5'>堆</b>”和“<b class='flag-5'>棧</b>”七大不同之處

    C語言內存的筆記資料說明

    本文檔的主要內容詳細介紹的是C語言內存的筆記資料說明說明了C語言中
    發表于 02-14 08:00 ?3次下載
    <b class='flag-5'>C</b>語言內存<b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>的筆記資料說明

    單片機區別

    M0一、空間的區別:(1)區(st
    發表于 11-13 14:51 ?9次下載
    單片機<b class='flag-5'>中</b><b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>的<b class='flag-5'>區別</b>

    C++struct和class的區別?

    C++struct和class的區別是什么?C++struct和class的最大區別在于:
    的頭像 發表于 03-10 17:41 ?797次閱讀

    嵌入式C語言中區別

    在嵌入式C語言中,都是用來存儲變量的內存區域,但它們在存儲和使用變量方面有很大的區別。
    的頭像 發表于 04-14 11:45 ?1478次閱讀

    區別和使用注意事項

    是在計算機科學中廣泛使用的兩種數據結構,它們具有不同的用途和特點。區別涉及到內存分配、訪問方式、數據存儲等方面。在使用
    的頭像 發表于 01-18 17:24 ?2333次閱讀
    百家乐赌博大全| 大发888娱乐城 健账号| 免佣百家乐官网的玩法| 大发888真钱棋牌| 利高百家乐娱乐城| 网络百家乐官网金海岸破解软件| 立即博最新网址| JJ百家乐的玩法技巧和规则| 网上百家乐优博| 赌博中百家乐官网什么意思| 百家乐www| 网上玩百家乐会出签吗| 百家乐官网几点不用补牌| 总统百家乐官网的玩法技巧和规则| 漠河县| 世界德州扑克大赛| 金满堂百家乐的玩法技巧和规则| 百家乐娱乐天上人间| 至尊百家乐官网赌场娱乐网规则| 百家乐官网桌子10人| 投注平台出租| 大发888老l| 联合百家乐的玩法技巧和规则| 大发888体育竞技| 六合彩下注| 百家乐官网输钱的原因| 优博家百家乐官网娱乐城| k7娱乐城备用网址| 申博太阳城娱乐城| 缅甸百家乐娱乐场开户注册 | 大发888赌博| 巴南区| 延吉市| 金傲皇冠网论坛| 皇冠现金网网址| 大连娱网棋牌步步为赢| 怎样看百家乐官网牌| 百家乐888| 百家乐官网最低投注| 申博百家乐官网有假吗| 百家乐二号博彩正网|