C 自動變數和棧原理

2021-08-18 01:16:49 字數 751 閱讀 9396

了解典型的c++編譯器如何實現自動變數有助於更深入地了解自動變數。

由於自動變數的數目隨函式的開始和結束而增減,因此程式必須在執行時對自動變數進行管理。常用的方法是留出一段記憶體,並將其視為棧,以管理變數的增減。之所以被稱為,是由於新資料被象徵性地放在原有資料的上面(也就是說,在相鄰的記憶體單元中,而不是在同乙個記憶體單元中),當程式使用完後,將其從棧中刪除。棧的預設長度取決於實現,但編譯器通常提供改變棧長度的選項。程式使用兩個指標來跟蹤棧,乙個指標指向棧底——棧的開始位置,另乙個指標指向堆頂——下乙個可用記憶體單元。當函式被呼叫時,其自動變數將被加入到棧中,棧頂指標指向變數後面的下乙個可用的記憶體單元。函式結束時,棧頂指標被重置為函式被呼叫前的值,從而釋放新變數使用的記憶體。

棧是lifo(後進先出)的,即最後加入到棧中的變數首先被彈出。這種設計簡化了引數傳遞。函式呼叫將其引數的值放在棧頂,然後重新設定棧頂指標。被呼叫的函式根據其形參描述來確定每個引數的位址。例如,下圖表明,函式fib( )被呼叫時,傳遞乙個2位元組的int和乙個4位元組的long。這些值被加入到棧中。當fib( )開始執行時,它將名稱real和tell同這兩個值關聯起來。當fib( )結束時,棧頂指標重新指向以前的位置。新值沒有被刪除,但不再被標記,它們所佔據的空間將被下乙個將值加入到棧中的函式呼叫所使用(圖9.3做了簡化,因為函式呼叫可能傳遞其他資訊,如返回位址)。

棧和堆原理介紹

c 應用中記憶體分為2部分,一部分是棧 stack,也稱堆疊 另一部分是堆 heap 棧 可以把棧看成是一疊卡片,最上面的卡片表示程式的當前作用域,這往往就是當前正在執行的函式。當前函式中宣告的所有變數都置於棧頂幀中,即占用棧頂幀的記憶體,這就相當於一疊卡片中最上面的一張卡片。如果當前函式呼叫了另乙...

C 作用域 自動變數 靜態持續變數彙總

這一部分內容容易忘記 弄混,所以在這裡記錄一下。1.作用域 作用域描述了名稱在檔案的多大範圍可見。1 作用域為區域性的變數只能在定義它的 塊中可見,塊是由花括號括起的一系列語句。2 作用域為全域性的變數在定位位置到檔案結尾之間都可以用,自動變數 函式定義中宣告的變數,包括函式引數 的作用域為區域性的...

c 棧和佇列

c 棧 include using std stack s.empty 如果棧為空返回1,否則返回0 s.size 返回棧中元素的個數 s.pop 刪除棧頂元素但不返回其值 s.top 返回棧頂的元素,但不刪除該元素 s.push 在棧頂壓入新元素 測試例項 include include usin...