數據結構上的堆棧、操作系統上的堆棧,彙編語言的堆棧、還有C語言本身的堆棧,有什麼不同?
01-26
目前我的理解:
數據結構上,堆和棧是不同的數據結構,堆似乎是先進後出,棧不詳。操作系統上的堆棧就是堆棧段啦,印象中局部變數放在這裡,靜態變數放哪裡不詳,全局變數放哪裡不詳,還有那些死的不會變的字元串放哪裡也不祥。彙編語言里的堆棧一個是同樣涉及堆棧段來存數據的情況,另一個就是比如一個函數執行完了,需要跳回到調用它的函數,就要pop啊,這裡也有堆棧的事。C語言本身的堆棧,我不知道是什麼啊,但是面試里被人問到了啊,聯想起上學時學過的彙編語言、數據結構、C語言,還是不知道啊。
數據結構中棧,先進後出的一種結構,而堆指的是優先隊列,帶優先順序的隊列。
c語言的堆棧,是指一個程序運行起來系統給分配的區域,總共5個,堆棧區,簡稱棧區,系統自動釋放的區域。堆區,需要程序員自己手動開闢和釋放(malloc,free)的區域。靜態區(全局區)static。常量區(字元串常量等)。代碼區。(這裡指的是用戶棧了)
彙編語言中堆棧的作用當出現參數太多,寄存器不夠用時,暫時存儲到的地方。
操作系統堆棧(系統棧)的作用主要是調用子程序時暫存斷點地址和保護(恢復)現場數據。
這幾個堆棧說通俗作用基本上暫時存放數據和地址,保護現場和斷點么,名字一樣不是沒原因的。
c程序最終還不是要轉化為彙編來執行。首先,在任何一個概念中,堆和棧是完全不同的兩碼事。
- 數據結構中,堆 (數據結構):最小堆或者最大堆;棧:後進先出。
- 操作系統上,只有棧的概念,沒有堆的概念。棧用來記錄過程調用、保存數據等。棧分內核棧和用戶棧,用戶棧就是下面3中所說的棧。
- 編程語言層面(不管是彙編還是 C),棧是 esp 指向的內存區域,堆是程序 data 段的一部分。棧的作用還是「記錄過程調用、保存數據」,堆的作用是保存棧中放不下的數據或者生命周期不固定的數據。
- 堆是部分操作系統提供的特性,在 POSIX 中使用 sbrk / brk 系統調用實現。而棧是 CPU 提供的特性之一。
在你說的四種場景中 堆和棧都是不同的東西
[低水平帖]啥叫堆?啥叫棧?見168樓
先拋開堆不說,只說棧:1.如果把c語言編譯鏈接成彙編語言(其實準確說是機器指令),那麼c語言里所用的棧就是彙編語言所用的棧,他們兩個完全是一個東西.2.彙編語言(或者說純機器指令)所用的棧,其實就是操作系統所用的棧,也是同一個東西.反過來說(linux2.4內核為例,別的不了解):1.操作系統給每個進程都虛擬出4GB大小的內存,前3GB給你的程序用,其中一部分作為你程序的棧.後1GB操作系統自己用,也有一小部分作為系統的棧.2.給你程序用的那部分棧,就被c語言利用起來,你平常用c語言編寫的程序,函數調用時用的棧,就是這個東西.再來說堆(還是linux2.4內核……知識有限…只看過這個):
1.之前說操作系統把3GB虛擬的內存給你的程序用,最簡單的情況下,這3GB的最前面是你程序編譯鏈接後的指令,最後面就是棧,它從後往前延伸. 而中間那部分就被用作堆,是從你程序指令所佔內存結尾開始往後延伸.
2.c程序先從操作系統的堆裡面要,比如一次要了10MB,c程序自己管理這些內存,你malloc的時候c程序就從這10MB里分配給你,等不夠用的時候,就再和操作系統要.malloc和free這兩個庫函數負責管理這塊空間,你要多少就給多少,還要保證每次分配出去的那塊都得是連續的.這個就叫做堆了.推薦阮一峰博客文章。Stack的三種含義
謹慎將堆和棧連在一起念。這在很多大學裡的教師嘴裡經常脫口而出,導致學生也跟著這樣念,日子長了自己也會模糊兩者的概念。
說實話,對堆棧沒太多研究。
暫時先回答我了解的。以後有空研究了之後再補充。數據結構上的堆棧
應該就只是普通意義上的堆棧,主要是講解堆棧的原理吧?操作系統上的堆棧
只是指的是,在特定環境下,你此處所說的,某個操作系統中的堆棧而已。
一般內部又分,內核堆棧和用戶堆棧。不同層面的劃分也很多,比如:進程的堆棧,等等。彙編語言的堆棧
偶孤陋寡聞,沒聽說過。C語言本身的堆棧
只是指的是C語言,在具體的實現環境下,用到的堆棧而已。可參考我之前的理解:Uboot中start.S源碼的指令級的詳盡解析中的「為何C語言(的函數調用)需要堆棧,而彙編語言卻不需要堆棧」
PS:最好把你所指代的東西,用具體的例子來說明,以便於回答問題的人,更加清楚你到底想問的是什麼問題。據本人理解,棧在c語言,彙編語言里是一樣的,都是用來保存現場參數,用來跳轉完了返回現場,繼續往下執行代碼用的,在操作系統里不太了解。建議你看看王爽老師的彙編語言,會有幫助你理解棧的概念
推薦閱讀: