<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          計(jì)算幾種的堆棧與堆分別是什么

          共 1589字,需瀏覽 4分鐘

           ·

          2022-06-15 13:54

          什么是內(nèi)存逃逸

          1. 在程序中,每個(gè)函數(shù)塊都會(huì)有自己的內(nèi)存區(qū)域用來(lái)存自己的局部變量(內(nèi)存占用少)、返回地址、返回值之類的數(shù)據(jù),這一塊內(nèi)存區(qū)域有特定的結(jié)構(gòu)和尋址方式,尋址起來(lái)十分迅速,開銷很少。這一塊內(nèi)存地址稱為棧。
          2. 棧是線程級(jí)別的,大小在創(chuàng)建的時(shí)候已經(jīng)確定,當(dāng)變量太大的時(shí)候,會(huì)"逃逸"到堆上,這種現(xiàn)象稱為內(nèi)存逃逸。
          3. 簡(jiǎn)單來(lái)說(shuō),局部變量通過(guò)堆分配和回收,就叫內(nèi)存逃逸。
            本文轉(zhuǎn)自計(jì)算機(jī)中的堆棧和堆區(qū)別

          內(nèi)存逃逸的危害

          1. 堆是一塊沒有特定結(jié)構(gòu),也沒有固定大小的內(nèi)存區(qū)域,可以根據(jù)需要進(jìn)行調(diào)整。
          2. 全局變量,內(nèi)存占用較大的局部變量,函數(shù)調(diào)用結(jié)束后不能立刻回收的局部變量都會(huì)存在堆里面。
          3. 變量在堆上的分配和回收都比在棧上開銷大的多。
          4. 對(duì)于 go 這種帶 GC 的語(yǔ)言來(lái)說(shuō),會(huì)增加 gc 壓力,同時(shí)也容易造成內(nèi)存碎片。

          如何分析內(nèi)存逃逸

          在使用go build命令時(shí)添加編譯參數(shù)-gcflags=-m。完整命令go build --gcflags=-m ./demo1.go,運(yùn)行結(jié)果中帶有下面的heap表示發(fā)生了內(nèi)存逃逸情況。

          ╰─ go build --gcflags=-m ./demo1.go
          # command-line-arguments
          ./demo1.go:13:6: can inline main
          ./demo1.go:18:2: moved to heap: y(提示發(fā)生了內(nèi)存逃逸情況)

          什么是堆棧

          1. 堆棧是計(jì)算機(jī)內(nèi)存的一個(gè)特殊區(qū)域,用于存儲(chǔ)由函數(shù)創(chuàng)建的臨時(shí)變量。在堆棧中,變量在運(yùn)行時(shí)被聲明、存儲(chǔ)和初始化。
          2. 它是一個(gè)臨時(shí)存儲(chǔ)內(nèi)存。計(jì)算任務(wù)完成后,變量的內(nèi)存將自動(dòng)擦除。堆棧部分主要包含方法、局部變量和引用變量。

          什么是堆

          1. 堆是編程語(yǔ)言用來(lái)存儲(chǔ)全局變量的內(nèi)存。默認(rèn)情況下,所有全局變量都存儲(chǔ)在堆內(nèi)存空間中。它支持動(dòng)態(tài)內(nèi)存分配。
          2. 堆不會(huì)自動(dòng)為您管理,也不會(huì)由 CPU 嚴(yán)格管理。它更像是一個(gè)自由浮動(dòng)的內(nèi)存區(qū)域。

          堆棧和棧的區(qū)別

          1. 堆棧是線性數(shù)據(jù)結(jié)構(gòu),而堆是分層數(shù)據(jù)結(jié)構(gòu)。
          2. 堆棧內(nèi)存永遠(yuǎn)不會(huì)變得碎片化,而堆內(nèi)存可能會(huì)變得碎片化,因?yàn)槭紫确峙鋬?nèi)存塊,然后釋放內(nèi)存塊。
          3. 堆棧僅訪問局部變量,而堆允許您全局訪問變量。
          4. 堆棧變量不能調(diào)整大小,而堆變量可以調(diào)整大小。
          5. 堆棧內(nèi)存在連續(xù)塊中分配,而堆內(nèi)存按任意隨機(jī)順序分配。
          6. 堆棧不需要取消分配變量,而在堆中則需要取消分配。
          7. 堆棧分配和解除分配由編譯器指令完成,而堆分配和解除分配由程序員完成。

          使用堆棧的優(yōu)點(diǎn)

          1. 幫助您以“最后先出(LIFO)”方法管理數(shù)據(jù),這在鏈表和數(shù)組中是不可能的。
          2. 當(dāng)調(diào)用函數(shù)時(shí),局部變量存儲(chǔ)在堆棧中,一旦返回,它就會(huì)被自動(dòng)銷毀。
          3. 當(dāng)變量未在該函數(shù)外部使用時(shí),將使用堆棧。
          4. 它允許您控制如何分配和釋放內(nèi)存。
          5. 堆棧會(huì)自動(dòng)清理對(duì)象。
          6. 不易損壞,無(wú)法調(diào)整變量大小。

          使用堆內(nèi)存的優(yōu)點(diǎn)

          1. 堆可幫助您找到最大和最小數(shù)字
          2. 垃圾回收在堆內(nèi)存上運(yùn)行,以釋放對(duì)象使用的內(nèi)存。
          3. 堆方法也用于優(yōu)先級(jí)隊(duì)列。
          4. 它允許您全局訪問變量。
          5. 堆對(duì)內(nèi)存大小沒有任何限制。

          使用堆棧的缺點(diǎn)

          1. 堆棧內(nèi)存非常有限。
          2. 在堆棧上創(chuàng)建太多對(duì)象會(huì)增加堆棧溢出的風(fēng)險(xiǎn)。
          3. 隨機(jī)訪問是不可能的。
          4. 變量存儲(chǔ)將被覆蓋,這有時(shí)會(huì)導(dǎo)致函數(shù)或程序的未定義行為。
          5. 堆棧將落在內(nèi)存區(qū)域之外,這可能會(huì)導(dǎo)致異常終止。

          使用堆的缺點(diǎn)

          1. 它可以提供操作系統(tǒng)可以提供的最大內(nèi)存
          2. 計(jì)算需要更多時(shí)間。
          3. 堆內(nèi)存中的內(nèi)存管理更為復(fù)雜,因?yàn)樗侨质褂玫摹?/section>
          4. 與堆棧相比,它在執(zhí)行中花費(fèi)的時(shí)間太多。

          何時(shí)使用堆或堆棧

          1. 當(dāng)您需要分配大塊內(nèi)存時(shí),應(yīng)使用堆。例如,您希望創(chuàng)建一個(gè)大尺寸數(shù)組或大結(jié)構(gòu)來(lái)長(zhǎng)時(shí)間保留該變量,然后您應(yīng)該在堆上分配它。
          2. 但是,如果您正在使用相對(duì)較小的變量,則只有在使用它們的函數(shù)處于活動(dòng)狀態(tài)時(shí)才需要這些變量。然后,您需要使用堆棧,這樣更快,更容易。


          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  热久久最新视频 | 成人三级片免费 | 国产亲妺妺乱的性视频 | 人人色视频 | 日韩综合色 |