小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

棧的增長方向

 e3399 2012-05-02

棧的增長方向

Tag:向下走

版權(quán)聲明:轉(zhuǎn)載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://dreamhead./logs/4840895.html

如何判斷棧的增長方向?

對于一個用慣了i386系列機器的人來說,這似乎是一個無聊的問題,因為棧就是從高地址向低地址增長。不過,顯然這不是這個問題的目的,既然把這個問題拿出來,問的就不只是i386系列的機器,跨硬件平臺是這個問題的首先要考慮到的因素。

在一個物質(zhì)極大豐富的年代,除非無路可退,否則我們堅決不會使用匯編去解決問題,而對于這種有系統(tǒng)編程味道的問題,C是一個不錯的選擇。那接下來的問題就是如何用C去解決這個問題。

C在哪里會用到棧呢?稍微了解一點C的人都會立刻給出答案,沒錯,函數(shù)。我們知道,局部變量都存在于棧之中。似乎這個問題立刻就得到了解答,用一個函數(shù)聲明兩個局部變量,然后比較兩個變量的地址,這樣就可以得到答案。

等一下,怎么比較兩個變量的地址呢?

先聲明的先入棧,所以,它的第一個變量的地址如果是高的,那就是從上向下增長?!跋嚷暶鞯南热霔!??這個結(jié)論從何而來?一般編譯器都會這么處理。要是不一般呢?這種看似正確的方法實際上是依賴于編譯器的,所以,可移植性受到了挑戰(zhàn)。

那就函數(shù)加個參數(shù),比較參數(shù)和局部變量的位置,參數(shù)肯定先入棧。那為什么不能局部變量先入棧?第一反應(yīng)是怎么可能,但仔細想來又沒有什么不可以。所以,這種方法也依賴于編譯器的實現(xiàn)。

那到底什么才不依賴于編譯器呢?

不妨回想一下,函數(shù)如何調(diào)用。執(zhí)行一個函數(shù)時,這個函數(shù)的相關(guān)信息都會出現(xiàn)棧之中,比如參數(shù)、返回地址和局部變量。當(dāng)它調(diào)用另一個函數(shù)時,在它棧信息保持不變的情況下,會把它調(diào)用那個函數(shù)的信息放到棧中。

似乎發(fā)現(xiàn)了什么,沒錯,兩個函數(shù)的相關(guān)信息位置是固定的,肯定是先調(diào)用的函數(shù)其信息先入棧,后調(diào)用的函數(shù)其信息后入棧。那接下來,問題的答案就浮出了水面。

比如,設(shè)計兩個函數(shù),一個作為調(diào)用方,另一個作為被調(diào)用方。被調(diào)用方以一個地址(也就是指針)作為自己的入口參數(shù),調(diào)用方傳入的地址是自己的一個局部變量的地址,然后,被調(diào)用方比較這個地址和自己的一個局部變量地址,由此確定棧的增長方向。

給出了一個解決方案之后,我們再回過頭來看看為什么之前的做法問題出在哪。為什么一個函數(shù)解決不了這個問題。前面這個大概解釋了函數(shù)調(diào)用的過程,我們提到,函數(shù)的相關(guān)信息會一起送入棧,這些信息就包括了參數(shù)、返回地址和局部變量等等,在計算機的術(shù)語里,有個說法叫棧幀,指的就是這些與一次函數(shù)調(diào)用相關(guān)的東西,而在一個棧幀內(nèi)的這些東西其相對順序是由編譯器決定的,所以,僅僅在一個棧幀內(nèi)做比較,都會有對編譯器的依賴。就這個問題而言,參數(shù)和局部變量,甚至包括返回地址,都是相同的,因為它們在同一個棧幀內(nèi),它們之間的比較是不能解決這個問題的,而它們就是一個函數(shù)的所有相關(guān)信息,所以,一個函數(shù)很難解決這個問題。

好了,既然有了這個了解,顯然可以擴展一下前面的解決方案,可以兩個棧幀內(nèi)任意的東西進行比較,比如,各自的入口參數(shù),都可以確定棧的增長方向。

狂想一下,會不會有編譯器每次專門留下些什么,等下一個函數(shù)的棧幀入棧之后,在把這個留下的東西入棧呢?這倒是個破壞的好方法。如果哪位知道有這么神奇的編譯器,不妨告訴我。我們可以把它的作者拉過來打一頓,想折磨死誰??!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多