版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、、大家討論一下CC、C#、java、在編譯時(shí),分別是怎樣分配內(nèi)存的。我知道:.CC把局部變量放在堆棧中,全局、靜態(tài)變量放在堆中,.C#把值類型都放在堆棧中,引用類型放在堆中。.java我不清楚。大家深入討論一下.論者有分。2、另外,想學(xué)習(xí)上面那些知識(shí),要那本書籍?。。ㄒ?jīng)典的、越深入越好)。謝謝!1樓nuaacims(沉底魚)回復(fù)于2003072809:38:39得分0java沒指針,有一個(gè)類似指針的reference,java中內(nèi)存的
2、析構(gòu)由GC垃圾收集器自動(dòng)進(jìn)行。Top2樓lemonutzf(lemonut)回復(fù)于2003072810:09:09得分0to:ny_lau(我行我素)我想你是理解錯(cuò)了CC的內(nèi)存分配是:全局,靜態(tài)變量放到靜態(tài)存儲(chǔ)區(qū)中;局部變量放到棧中;動(dòng)態(tài)分配的變量放到堆中;java.............:對(duì)象放到堆中;對(duì)象放到堆中;引用,基本類型放到棧中,引用,基本類型放到棧中,有的放到靜態(tài)存儲(chǔ)區(qū)中;有的放到靜態(tài)存儲(chǔ)區(qū)中;Top3樓devzhao(
3、wincer)回復(fù)于2003072810:12:26得分0我想樓主對(duì)CC確實(shí)理解錯(cuò)了,應(yīng)該是lemonutzf(lemonut)所說(shuō)的:CC的內(nèi)存分配是:全局,靜態(tài)變量放到靜態(tài)存儲(chǔ)區(qū)中;局部變量放到棧中;動(dòng)態(tài)分配的變量放到堆中;Top4樓wade530(wade)回復(fù)于2003072810:42:31得分0同上意見Top5樓susanyw(susan)回復(fù)于2003072814:14:25得分0c#和java等語(yǔ)言稱為內(nèi)存托管的程序設(shè)計(jì)
4、語(yǔ)言,他們沒有指針的概念,他們的內(nèi)存分配與回收全由os或編譯器完成,而現(xiàn)在也出現(xiàn)了所謂“托管的c”。在c中內(nèi)存一般從“堆”和“?!鄙戏峙洌麄兊膮^(qū)別是:1)heap由用戶(程序員)負(fù)責(zé)內(nèi)存的分配與回收,既c中的“new”和明確區(qū)分堆與棧在bbs上,堆與棧的區(qū)分問(wèn)題,似乎是一個(gè)永恒的話題,由此可見,初學(xué)者對(duì)此往往是混淆不清的,所以我決定拿他第一個(gè)開刀。首先,我們舉一個(gè)例子:voidf()intp=newint[5]這條短短的一句話就包含了
5、堆與棧,看到new,我們首先就應(yīng)該想到,我們分配了一塊堆內(nèi)存,那么指針p呢?他分配的是一塊棧內(nèi)存,所以這句話的意思就是:在棧內(nèi)存中存放了一個(gè)指向一塊堆內(nèi)存的指針p。在程序會(huì)先確定在堆中分配內(nèi)存的大小,然后調(diào)用operatnew分配內(nèi)存,然后返回這塊內(nèi)存的首地址,放入棧中,他在VC6下的匯編代碼如下:00401028push14h0040102Acalloperatnew(00401060)0040102Faddesp400401032m
6、ovdwdptr[ebp8]eax00401035moveaxdwdptr[ebp8]00401038movdwdptr[ebp4]eax這里,我們?yōu)榱撕?jiǎn)單并沒有釋放內(nèi)存,那么該怎么去釋放呢?是p么?澳,錯(cuò)了,應(yīng)該是[]p,這是為了告訴編譯器:我刪除的是一個(gè)數(shù)組,VC6就會(huì)根據(jù)相應(yīng)的Cookie信息去進(jìn)行釋放內(nèi)存的工作。好了,我們回到我們的主題:堆和棧究竟有什么區(qū)別?主要的區(qū)別由以下幾點(diǎn):1、管理方式不同;2、空間大小不同;3、能否產(chǎn)生
7、碎片不同;4、生長(zhǎng)方向不同;5、分配方式不同;6、分配效率不同;管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memyleak??臻g大小:一般來(lái)講在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,從這個(gè)角度來(lái)看堆內(nèi)存幾乎是沒有什么限制的。但是對(duì)于棧來(lái)講,一般都是有一定的空間大小的,例如,在VC6下面,默認(rèn)的??臻g大小是1M(好像是,記不清楚了)。當(dāng)然,我們可以修改:打開工程,依次操作菜單如
8、下:ProjectSettingLink,在Categy中選中Output,然后在Reserve中設(shè)定堆棧的最大值和commit。注意:reserve最小值為4Byte;commit是保留在虛擬內(nèi)存的頁(yè)文件里面,它設(shè)置的較大會(huì)使棧開辟較大的值,可能增加內(nèi)存的開銷和啟動(dòng)時(shí)間。碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c++內(nèi)存分配
- c c++語(yǔ)言變量聲明內(nèi)存分配
- java內(nèi)存分配與管理是java的核心技術(shù)之一
- 內(nèi)存分配
- java高內(nèi)存編程
- java堆內(nèi)存與棧內(nèi)存的區(qū)別
- 內(nèi)存區(qū)劃分、內(nèi)存分配、常量存儲(chǔ)區(qū)、堆、棧、自由存儲(chǔ)區(qū)、全局區(qū)[c++][內(nèi)存管理]
- c,c++內(nèi)存分配的詳細(xì)講解包括堆,棧,數(shù)據(jù)段等
- 支持內(nèi)存不連續(xù)分配
- c語(yǔ)言內(nèi)存講解
- c++內(nèi)存管理
- java內(nèi)存原型及工作原理簡(jiǎn)介
- Java內(nèi)存泄漏規(guī)約及其工具研究.pdf
- Java內(nèi)存泄漏發(fā)現(xiàn)技術(shù)研究.pdf
- Memcached內(nèi)存分配算法及優(yōu)化.pdf
- Java程序內(nèi)存使用分析技術(shù)研究.pdf
- java內(nèi)存的詳細(xì)分析(包括垃圾回收)
- 內(nèi)存分配方式,堆和棧區(qū)別
- 第八講內(nèi)存的動(dòng)態(tài)分配-
- 北大青鳥西安華美校區(qū)告訴你分配內(nèi)存時(shí)如何減少內(nèi)存碎片
評(píng)論
0/150
提交評(píng)論