- 在通常情況下由操作系統(OS)和語言的運行時(runtime)控制嗎?
- 它們的作用範圍是什麼?
- 它們的大小由什麼決定?
- 哪個更快?
答案:
- 當線程創建的時候,操作系統(OS)爲每一個系統級(system-level)的線程分配棧。通常情況下,操作系統通過調用語言的運行時(runtime)去爲應用程序分配堆。
- 棧附屬於線程,因此當線程結束時棧被回收。堆通常通過運行時在應用程序啓動時被分配,當應用程序(進程)退出時被回收。
- 當線程被創建的時候,設置棧的大小。在應用程序啓動的時候,設置堆的大小,但是可以在需要的時候擴展(分配器向操作系統申請更多的內存)。
- 棧比堆要快,因爲它存取模式使它可以輕鬆的分配和重新分配內存(指針/整型只是進行簡單的遞增或者遞減運算),然而堆在分配和釋放的時候有更多的複雜的 bookkeeping 參與。另外,在棧上的每個字節頻繁的被複用也就意味着它可能映射到處理器緩存中,所以很快(譯者注:局部性原理)。
類和結構:
類:
類是引用類型在堆上分配,類的實例進行賦值只是複製了引用,都指向同一段實際對象分配的內存
類有構造和析構函數
類可以繼承和被繼承
結構:
結構是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結構的賦值將分配產生一個新的對象。
結構沒有構造函數,但可以添加。結構沒有析構函數
結構不可以繼承自另一個結構或被繼承,但和類一樣可以繼承自接口
示例:
根據以上比較,我們可以得出一些輕量級的對象最好使用結構,但數據量大或有複雜處理邏輯對象最好使用類。