關於堆和棧,你真的瞭解嗎?
大家可能會以爲我今天準備跟你們聊的是數據結構偏軟件層面的堆跟棧,不過由於這方面內容涉及較多,偏軟件層面的堆和棧我會在後期文章中着重講解,所以今天給大家帶來的主角是硬件層面的堆和棧!
基本介紹
在嵌入式和單片機開發領域中,堆和棧是非常重要的基礎知識,但對於許多開發者來說,對這方面的概念還是非常的模糊,甚至基本沒了解過。
- 棧:基本上可以理解爲,函數的局部變量都是存放在棧裏面的。
- 堆:程序中全局、靜態變量,以及內存管理所用的內存,都屬於堆區。
增長方向
- 一般在CPU中,棧增長方向是向下的,而堆的生長方向是向上的。
- 所有的內存分爲:堆+棧。
- 他們各自的起始地址和增長方向不同,都沒有一個固定的界限,所以一旦堆棧衝突,系統就到了崩潰的地步了!
大小端模式
- CPU中的堆棧地址,調試打印輸出時,看到的地址字節倒序了,其實這是大小端地址存儲的原因。
- 舉個例子,STM32屬於的是小端模式;
在STM32代碼中定義一個變量爲 u32 temp = 0x12345678,我們可以用unsigned char buf[4]來表示temp,如下右圖爲STM32的變量存儲內容。
其他注意
-
內存=靜態存儲區+棧區。
-
如果使用了malloc來進行動態分配內存的話,內存=靜態存儲+棧區+堆區。
-
RO-data表示 程序定義的常量。
RW-data表示 已初始化的全局變量。
ZI-data表示 未初始化的全局變量
陳皮仔技術專欄:
CSDN:https://blog.csdn.net/Mr_Lester
簡書:https://www.jianshu.com/u/2c67d6b3badc
掘金:https://juejin.im/user/5e7423dd5188254935094193/posts
知乎:https://www.zhihu.com/people/chenpizai/posts
關注 “陳皮仔” 公衆號,回覆關鍵字"皮友java教程",即可獲得無價之寶—>java教程,從此青銅到王者不是夢!