2014-04-16 74 views
0

成份:在堆棧上分配對象的好處?

  • 兩種語言 - 如C++和C#
  • 類型方式比更復雜的只是一個Point有兩個成員(字段xy

在C#這樣類型將被定義爲引用類型,迫使它將其始終分配在堆上。在C++中,分配由使用來定義,而不是由類型定義來定義,因此可以在堆棧中分配它。

這樣做的好處是RAII模式,可以在對象超出範圍後自動清除數據。在C#中,您必須使用using作爲明確的「清理範圍」(這也是由於非確定性GC)。

第二我知道的是速度 - 堆棧訪問速度更快。

我的問題是這樣的 - 是否有任何(命名一個就足夠了)其他真正的好處(除了RAII和速度)在堆棧上分配複雜對象的能力(比如在C++中) C#)?

真實 - 我更希望找到一些「始終處於堆上」的方法,因爲RAII解決方案畢竟具有不同的語法。

這個問題不涉及C#中的值類型(結構)!這是跨語言的比較。

+0

事情是,對於一切都很好的事情,RAII是有點全面的。您還沒有提到異常安全性,這是帶有異常的RAII(假設代碼在某個級別的try塊中運行)。 – juanchopanza

+0

@ juanchopanza,謝謝,但它已經基於RAII,並且指出了C#世界中的對應部分。 – greenoldman

回答

3

沒有任何(命名一個就足夠了),除了RAII等實實在在的好處和級到堆棧

是分配複雜對象的能力,而這一次要比速度更重要分配:訪問速度。您可以通過消除不必要的間接來獲得戲劇性的性能提升。最近Herb Sutter給出an interesting talk,其中包括他對連續記憶的強烈愛好。他引用的一個示例項目通過使預取程序的生活變得更容易,從而獲得了50倍的性能提升。 (是的,我們認爲快50倍,不快50%!)

+0

:-D這是有趣的誤解 - 沒有「能力的速度」這樣的東西,這句話是「能力的好處」,我一般提到速度。 – greenoldman

+0

@greenoldman您幾乎涵蓋了所有可能使編程功能變得良好的事情。 – Ben

1

這不是您的問題的真正答案,但它比適合評論的時間長。

這是一個誤解,在C#中值類型分配在堆棧上,引用類型分配在堆上。值類型沒有被定義爲堆棧中的東西。這是一個實現細節而不是設計規範。規範是價值類型複製值。這並不意味着它們必須存儲在堆棧中。可以實現完全不使用堆棧的C#編譯器。取決於它們是短命的還是長壽命的,值或引用類型的實例會轉到堆棧,堆或寄存器。未存儲在棧上的值類型的實例是

  • 字段在一個類
  • 盒裝值類型
  • 的匿名方法外變量
  • 迭代器塊的外變量

更多信息我建議閱讀Eric Lippert關於此事的帖子:

1

一個堆棧模型與堆+ GC的好處是,它更具有確定性。當然,在實時系統中,衡量一個函數需要多長時間是非常有用的,而當某些清理成本在未指定的稍後時間發生時,這很困難。