(1)管理方式不同:
程式執行時,棧是由作業系統自動分配管理,無需程式設計師人工控制,包括函式的引數值、返回值、區域性變數等。而堆空間的申請、釋放都是有程式設計師人工控制,也因此容易產生記憶體洩漏。
(2)空間大小不同:
棧是向低位址擴充套件,是一塊連續的記憶體區域。即棧頂的位址和棧的最大容量是系統預先規定好的,當申請的空間超過棧的剩餘空間時,將出現棧溢位錯誤。而堆是高位址擴充套件,是不連續的記憶體區域。因為系統是用鍊錶來儲存空閒記憶體位址的,且鍊錶的遍歷方向是由低位址向高位址擴充套件。
(3)產生碎片不同:
對於堆來說,頻繁的malloc/free(new/delete)勢必會造成記憶體空間的不連續,從而造成大量的記憶體碎片,程式的執行效率降低。而對於棧來說,分配的一定是連續的記憶體空間。
(4)分配方式不同:
堆都是程式中由malloc/new函式動態申請分配,有free/delete函式釋放的;而棧的分配和釋放是由作業系統完成的。棧的動態分配可有alloc()函式手動完成,但一般都無需手動操作,而是交給編譯器自動進行申請和釋放的。
(5)分配效率不同:
堆的記憶體分配效率比棧要低得多。因為棧是有作業系統提供的,會在底層堆疊提供支援,分配專門的暫存器存放棧的位址,包括壓棧出棧也都有專門的指令執行,所以執行效率很高。而堆則是有c函式提供支援,它的機制相對複雜,例如分配一塊記憶體,庫函式會按照一定的演算法在堆記憶體空間中搜尋可用的足夠大的記憶體空間,如果沒有足夠大的連續空間,則需要作業系統來重新整理堆記憶體,這樣才有機會分到足夠大小的空間,然後才返回。
Unix 環境變數
linux 下處理環境變數常見的幾個操作 env 顯示當前所有的環境變數 set 顯示當前bash下使用者自定義的變數和環境變數 export 把自定義的變數轉換成環境變數 環境表 unix 下的每乙個程式都會有一張環境表,其實我們可以想象,main函式使如下這種形式 int main int ar...
Unix環境變數 執行緒基礎
標頭檔案 include 返回值 若相等則返回非0值,否則返回0值 作用 判斷兩個執行緒id是否相等 pthread t pthread self void 標頭檔案 include 返回值 呼叫執行緒自身的執行緒id intpthread create pthread t tidp,const p...
環境變數區別
1 etc profile 此檔案為系統的每個使用者設定環境資訊,當使用者第一次登入時,該檔案被執行.並從 etc profile.d目錄的配置檔案中蒐集shell的設定。2 etc bashrc 為每乙個執行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取。3 ...