中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

基礎才是重中之重~理(li)解(jie)內存中的棧和堆

回到目錄

.NET中使用stack(棧)和heap(堆)兩(liang)種結構在內存中存儲數據,今天咱們(men)就來說(shuo)說(shuo)這兩(liang)個結構

  1. Value Types,值類型
          在C#中,值類型繼承自System.ValueType的,它們分別是
          Bool,   byte ,  char, decimal, double, enu, float, int, long, sbyte, short, struct, uint, ulong, ushort
  2. Reference Types 引用類型
       
    引用類型包括所有的從System.Object繼承下來的類型,它們分別是
           class, interface, delegate, object,string,其中string是一種特殊的引用類型,之后的文章中我會單獨說它,.net中的gc(垃圾回收)主要是回收heap中的內存。
  3. 指針:在C#中它已經被遺忘,但不能不說,因為引用類型在內在中事實上是以指針的形式存儲在Stack上的,而它的數據內容是在Heap上,也就是上引用類型其實是在stack上做了一個地址的引用。

Stack是自(zi)我(wo)(wo)維(wei)護的,意味著基(ji)本上不需要我(wo)(wo)們(men)手(shou)動(dong)進行內存管理,它(ta)有自(zi)己(ji)的內存管理體系,對(dui)于window來說(shuo)最高是1M,而(er)(er).net最大只能用256K沒有記錯的話,如果(guo)超出這(zhe)個范(fan)圍就會出現溢(yi)出。 而(er)(er)heap則是我(wo)(wo)們(men)建立object對(dui)象所存儲的地方,它(ta)可以(yi)由我(wo)(wo)們(men)自(zi)己(ji)用GC去回(hui)收也可以(yi)由.net自(zi)己(ji)去回(hui)收。

對(dui)于(yu)在教(jiao)科(ke)書(shu)上的(de)一(yi)個例子,我(wo)要說一(yi)下,就(jiu)是斐波(bo)那切數列問(wen)(wen)題(ti)(ti),一(yi)般書(shu)上都是用(yong)遞歸寫(xie)的(de),這(zhe)對(dui)于(yu)程序(xu)員的(de)影響事(shi)實上是很大(da)的(de),如果(guo)程序(xu)員用(yong)普(pu)通的(de)遞歸寫(xie)這(zhe)個算法,那你的(de)服(fu)務沒準(zhun)什(shen)么時候就(jiu)掛了,原因是內存(cun)出現(xian)stack溢出的(de)現(xian)象,具體的(de)原因用(yong)“老趙”同志寫(xie)了段話非常有代表性:它(ta)把普(pu)通遞歸改寫(xie)成(cheng)了尾遞歸解決了這(zhe)個問(wen)(wen)題(ti)(ti)。

int FactorialTailRecursion(int n, int acc)
{
if (n == 0) return acc;
return FactorialTailRecursion(n - 1, acc * n); //變量仍然對程序有影響,所以編譯器會一次一次堆累它使用的內存
}

改成尾遞歸之后:

int FactorialLoopOptimized(int n, int acc)
{
while (true)
{
if (n == 0) return acc;

acc *= n;
n--;
}
}

方法之前所積累(lei)下的(de)各種狀(zhuang)態(tai)對于遞(di)(di)歸(gui)(gui)調用(yong)(yong)結果已經沒有任何意義,因此完全可以(yi)把(ba)本次方法中(zhong)留在(zai)堆(dui)棧(zhan)中(zhong)的(de)數據完全清除,把(ba)空間讓給最(zui)后的(de)遞(di)(di)歸(gui)(gui)調用(yong)(yong)。這樣(yang) 的(de)優化(hua)便使得(de)遞(di)(di)歸(gui)(gui)不會(hui)(hui)在(zai)調用(yong)(yong)堆(dui)棧(zhan)上產生堆(dui)積,意味著即(ji)時(shi)是(shi)“無限”遞(di)(di)歸(gui)(gui)也不會(hui)(hui)讓堆(dui)棧(zhan)溢出”。這其實才是(shi)尾遞(di)(di)歸(gui)(gui)的(de)“正統”優化(hua)方式,那(nei)么我們先暫時(shi)忘記之前 的(de)“循環優化(hua)”,從最(zui)簡單的(de)示例(li)中(zhong)查(cha)看這樣(yang)的(de)優化(hua)是(shi)如(ru)何進行(xing)的(de)。

在這里,感謝老趙同志對基礎的透徹講(jiang)解。

回到目錄

posted @ 2012-02-10 23:32  張占嶺  閱讀(1700)  評論(1)    收藏  舉報