函數(shù)調(diào)用棧的工作過程 函數(shù)調(diào)用過程中棧到底是怎么壓入和彈出的?
函數(shù)調(diào)用過程中棧到底是怎么壓入和彈出的?例如:void fun(int a,int b,int c)調(diào)用fun(1,2,3)時:-將斷點(diǎn)的程序指針按入堆棧-依次按入堆棧3,2,1,并指定指向堆棧的參數(shù)
函數(shù)調(diào)用過程中棧到底是怎么壓入和彈出的?
例如:void fun(int a,int b,int c)調(diào)用fun(1,2,3)時:-將斷點(diǎn)的程序指針按入堆棧-依次按入堆棧3,2,1,并指定指向堆棧的參數(shù)變量指針。參數(shù)存儲位置是參數(shù)變量位置-按堆棧保存站點(diǎn)-執(zhí)行函數(shù)-彈出堆棧恢復(fù)站點(diǎn)-堆棧指針減去參數(shù)占用的字節(jié)數(shù),丟棄堆棧中的參數(shù)—捕捉堆棧斷點(diǎn)的程序指針加上調(diào)用語句的字節(jié)數(shù),并繼續(xù)執(zhí)行
例如:調(diào)用fun(1,2,3)時void fun(int a,int b,int c):將斷點(diǎn)的程序指針按入堆?!?,2,1按順序插入堆棧,并指定指向堆棧的參數(shù)變量指針。參數(shù)存儲位置是參數(shù)變量位置-按堆棧保存字段-執(zhí)行函數(shù)-彈出堆?;謴?fù)字段-堆棧指針減去參數(shù)占用的字節(jié)數(shù),丟棄堆棧中的參數(shù)-彈出斷點(diǎn)的程序指針加上調(diào)用語句的字節(jié)堆棧是一個實(shí)現(xiàn)“后進(jìn)先出”算法的數(shù)據(jù)結(jié)構(gòu)。堆棧就是這樣一種數(shù)據(jù)結(jié)構(gòu)。它是在內(nèi)存中打開一個存儲區(qū)域,并將數(shù)據(jù)一個一個地存儲在這個區(qū)域中(即“推送”)。地址指針總是指向最后一個數(shù)據(jù)被推入堆棧的數(shù)據(jù)單元。存儲地址指針的寄存器稱為堆棧指示符。開始放入數(shù)據(jù)的單元稱為堆棧的底部。數(shù)據(jù)逐個存儲。這個過程叫做“疊壓”。在壓棧過程中,壓入棧中的每一個數(shù)據(jù)都放在與上一個單元相連的下一個單元中,棧指示符中的地址自動增加1。讀取數(shù)據(jù)時,根據(jù)堆棧指示符中的地址讀取數(shù)據(jù),堆棧指示符中的地址數(shù)自動減少1。這個過程稱為彈出窗口。這樣就實(shí)現(xiàn)了后進(jìn)先出的原則。最基本的操作模式是stack-in和stack-out
stack實(shí)際上是兩種數(shù)據(jù)結(jié)構(gòu)。
堆棧是一種數(shù)據(jù)結(jié)構(gòu),其中數(shù)據(jù)項(xiàng)按順序排列。數(shù)據(jù)項(xiàng)只能在一端插入和刪除(稱為棧頂)。重點(diǎn):堆、亂序。堆棧,后進(jìn)先出。此數(shù)據(jù)結(jié)構(gòu)有兩種基本操作:堆棧壓縮和彈出。在堆??蚣苤?,有兩個標(biāo)記:堆棧底部和堆棧頂部。堆棧頂部表示要推送或彈出的數(shù)據(jù)的地址,而堆棧底部表示堆棧幀中最后一個數(shù)據(jù)的內(nèi)存地址。在Win32中,寄存器ESP存儲指向堆棧底部的指針,并且堆棧正向低地址方向增長,因此ESP指向堆棧頂部。堆棧比較(操作系統(tǒng)):由編譯器自動分配和釋放,并存儲函數(shù)的參數(shù)值和局部變量的值。它的操作類似于數(shù)據(jù)結(jié)構(gòu)中的堆棧。堆棧使用一級緩存。它通常在被調(diào)用時在存儲空間中,并在調(diào)用后立即釋放堆(操作系統(tǒng)):它通常由程序員分配和釋放。如果程序員不發(fā)布它,它可能會在程序結(jié)束時被操作系統(tǒng)回收。分配方法類似于鏈表。堆存儲在二級緩存中,其生命周期由虛擬機(jī)的垃圾收集算法決定(不是一旦它成為孤立對象,它就可以被回收)。因此,調(diào)用這些對象的速度相對較低。Heap(數(shù)據(jù)結(jié)構(gòu)):Heap可以看作是一個樹,比如Heap sort stack(數(shù)據(jù)結(jié)構(gòu)):后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。不同的語言有不同的描述。您可以檢查各種語言的API