棧對象、堆對象、靜態對象的比較

來源:互聯網
上載者:User
  棧對象的優勢是在適當的時候自動產生,又在適當的時候自動銷毀,不需要程式員操心;而且棧對象的建立速度一般較堆對象快,因為分配堆對象時,會調用operator new操作,operator new會採用某種記憶體空間搜尋演算法,而該搜尋過程可能是很費時間的,產生棧對象則沒有這麼麻煩,它僅僅需要移動棧頂指標就可以了。但是要注意的是,通常棧空間容量比較小,一般是1MB~2MB,所以體積比較大的對象不適合在棧中分配。特別要注意遞迴函式中最好不要使用棧對象,因為隨著遞迴調用深度的增加,所需的棧空間也會線性增加,當所需棧空間不夠時,便會導致棧溢出,這樣就會產生執行階段錯誤。

  堆對象,其產生時刻和銷毀時刻都要程式員精確定義,也就是說,程式員對堆對象的生命具有完全的控制權。我們常常需要這樣的對象,比如,我們需要建立一個對象,能夠被多個函數所訪問,但是又不想使其成為全域的,那麼這個時候建立一個堆對象無疑是良好的選擇,然後在各個函數之間傳遞這個堆對象的指標,便可以實現對該對象的共用。另外,相比於棧空間,堆的容量要大得多。實際上,當實體記憶體不夠時,如果這時還需要產生新的堆對象,通常不會產生執行階段錯誤,而是系統會使用虛擬記憶體來擴充實際的實體記憶體。
 
接下來看看static對象。

  首先是全域對象。全域對象為類間通訊和函數間通訊提供了一種最簡單的方式,雖然這種方式並不優雅。一般而言,在完全的物件導向語言中,是不存在全域對象的,比如C#,因為全域對象意味著不安全和高耦合,在程式中過多地使用全域對象將大大降低程式的健壯性、穩定性、可維護性和可複用性。C++也完全可以剔除全域對象,但是最終沒有,我想原因之一是為了相容C。

  其次是類的靜態成員,上面已經提到,基類及其衍生類別的所有對象都共用這個靜態成員對象,所以當需要在這些class之間或這些class objects之間進行資料共用或通訊時,這樣的靜態成員無疑是很好的選擇。

  接著是靜態局部對象,主要可用於儲存該對象所在函數被屢次調用期間的中間狀態,其中一個最顯著的例子就是遞迴函式,我們都知道遞迴函式是自己調用自己的函數,如果在遞迴函式中定義一個nonstatic局部對象,那麼當遞迴次數相當大時,所產生的開銷也是巨大的。這是因為nonstatic局部對象是棧對象,每遞迴調用一次,就會產生一個這樣的對象,每返回一次,就會釋放這個對象,而且,這樣的對象只局限於當前調用層,對於更深入的嵌套層和更淺露的外層,都是不可見的。每個層都有自己的局部對象和參數。

  在遞迴函式設計中,可以使用static對象替代nonstatic局部對象(即棧對象),這不僅可以減少每次遞迴調用和返回時產生和釋放nonstatic對象的開銷,而且static對象還可以儲存遞迴調用的中間狀態,並且可為各個調用層所訪問。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.