這篇文章分享一個面試中經常被問到的知識點:堆內存和棧內存有什么區別?平時開發應該使用堆內存還是棧內存?
要回答這個問題,我們首先需要知道什么是堆內存,什么是棧內存,它們的分配和回收有什么特點?
先介紹下棧內存:
棧內存是為線程留出的臨時空間,每個線程都有一個固定大小的棧空間,而且棧空間存儲的數據只能由當前線程訪問,所以它是線程安全的。
棧空間的分配和回收是由系統來做的,我們不需要手動控制。
當一個函數調用時,系統就會為該函數的調用分配棧空間,當函數返回后,系統就會自動回收這塊空間,同理,下次其它函數調用和返回,系統還是會自動分配和回收空間。
那它是怎么分配和回收的呢?
可以看這兩個動畫
棧空間的大小是固定的,它有一個水位線,標識棧空間的分配狀態,水位線里面的表示已經分配,然后這個水位線會根據函數調用和返回的情況自動調整。
這里可以看到,棧空間的分配和回收非常簡單,只需要調整水位線位置就可以了,沒有任何多余操作。
那堆內存呢?
我們平時在C語言和C++中使用malloc和new分配的內存就是堆內存,堆內存的一大特點就是大小不固定,可以動態擴容,空間由程序員動態分配,更加靈活。
然而,既然有優點也必然伴隨著缺點。
第一個缺點就是它容易產生內存泄露,malloc出來的沒有free,new出來的如果沒有delete,都會產生內存泄露,真正項目內存泄露產生的情況肯定比這個復雜的多。
第二個缺點,容易產生內存碎片,在分配和回收時需要對很多內存碎片進行整理,效率較低,具體可以看這個動畫。
所以才會有很多自定義的內存分配器,但它肯定還是沒有棧空間分配回收速度快。
第三個缺點,線程不安全,它不像棧內存是線程獨立的,堆內存可以被一個進程內所有的線程訪問,多線程操作就容易產生問題,很多奇奇怪怪的操作就是這么引起的。
那什么變量存儲在棧上,什么存儲在堆上呢?普通的A a,這種就是都存儲在棧上,當使用new和malloc分配的空間會存儲在堆上,看這個圖:
new出來的實際空間是在堆上分配,然后在棧上開辟一個指針大小的空間,這個空間有一個指針,指向堆上的那塊內存,這樣給變量和堆內存之間就關聯起來了。
那什么情況下使用棧內存,什么情況下使用堆內存呢?
我整理出來了一個表,貼在這里:
棧 | 堆 | |
速度 | 快 | 慢 |
空間管理 | 高效,不會產生碎片 | 會產生內存碎片 |
訪問權限 | 只能局部變量 | 可以訪問全局變量 |
空間大小限制 | 操作系統限制 | 沒有特定的限制 |
內存分配 | 連續 | 隨機分配 |
分配和釋放 | 編譯器指令自動管理 | 程序員手動管理 |
開銷 | 低 | 高 |
主要問題 | 空間小 | 內存碎片 |
靈活性 | 固定大小 | 可以resize |
這里可以根據實際需求來決定使用哪類內存。
當然,其實也不用關注那么多,我一般就是大內存使用堆,局部變量小內存使用棧。
這里還涉及到很多其它知識點,比如進程的內存空間布局是怎么樣的,棧空間會不會污染、堆內存具體是怎么分配和回收的。
具體在我的公眾號里搜索吧,里面有很多相關文章。
原文標題:堆內存和棧內存的區別
文章出處:【微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
-
內存
+關注
關注
8文章
3064瀏覽量
74383 -
C語言
+關注
關注
180文章
7615瀏覽量
137851 -
函數
+關注
關注
3文章
4346瀏覽量
63022
原文標題:堆內存和棧內存的區別
文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
談JVM xmx, xms等內存相關參數合理性設置
邏輯內存和物理內存的區別
反射內存卡的優勢與特點
![反射<b class='flag-5'>內存</b>卡的優勢與<b class='flag-5'>特點</b>](https://file1.elecfans.com/web2/M00/05/67/wKgZombZa5qALH5IAABXt3sjw8A000.png)
內存時鐘和內存條有什么不同
如何自定義內存控制器的設置
FreeRTOS如何在中斷中調用內存分配函數?
你知道嗎? 51單片機也有動態內存分配
![你知道嗎? 51單片機也有動態<b class='flag-5'>內存</b><b class='flag-5'>分配</b>](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
Linux內核內存管理之內核非連續物理內存分配
![Linux內核<b class='flag-5'>內存</b>管理之內核非連續物理<b class='flag-5'>內存</b><b class='flag-5'>分配</b>](https://file1.elecfans.com/web2/M00/C1/9D/wKgaomXX-KCADAsrAAAaZXMwKKg445.png)
評論