freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

初探j(luò)ava內(nèi)存機制_堆和棧-文庫吧資料

2024-10-14 01:14本頁面
  

【正文】 向的區(qū)域還在,所以能正確顯示。return 0。printf(“%sn”, f2())。return s。return s。接下來我們看一看一個非常常見的問題:下述代碼有沒有什么問題?有問題的話問題在哪里?[cpp] view plaincopyprint?include using namespace std。new來的int變量在堆中。// 下面的代碼是錯誤的,指針還沒指向就直接賦值了?int *p = 5。// “hactrox”在文字常量區(qū),s指向這個區(qū)域中的“hactrox”,所以這可以理解為,首先在文字常量區(qū)創(chuàng)建了這個字符串,然后s指向這個字符串這樣兩個步驟。// str和字符串存放在棧中static int a = 0。// 指針pBuffer在棧中,該內(nèi)存在堆中char *s = “hactrox”。// 存放在全局靜態(tài)區(qū)的未初始化區(qū)int main(){int i, j, k。// 存放在全局靜態(tài)區(qū)的未初始化區(qū)int num = 0。程序指令區(qū)最好理解,就是存放程序代碼的二進制指令。全局靜態(tài)區(qū)和堆一樣,程序結(jié)束后由操作系統(tǒng)進行釋放。一個 C或C++程序,它眼中的內(nèi)存地址分分為這么五個區(qū)域:棧區(qū)(stack)、堆區(qū)(heap)、全局靜態(tài)區(qū)(static)、文字常量區(qū)和程序指令區(qū)。這樣在每層調(diào)用結(jié)束,棧頂指針不斷下降(釋放內(nèi)存)的時候,就能正確返回到之前調(diào)用的位置并繼續(xù)往下執(zhí)行了。全局變量和static變量在編譯的時候就已經(jīng)在靜態(tài)存儲區(qū)分配好內(nèi)存了。然后把實參從右到左的順序依次入棧(大多數(shù)的C/C++編譯器為從右到左)接著是函數(shù)中的各種局部變量。注意這里的地址是指令地址,而不是變量地址什么的。}比如上述代碼,在調(diào)用func之前,首先把func的下一條語句,也就是printf語句的地址,存在棧中。printf(“%dn”, 100)。這樣當函數(shù)調(diào)用完成,棧頂指針一點點釋放內(nèi)存以后,棧頂指針指向了這個地址,就能返回到正確的位置繼續(xù)執(zhí)行了。// 正確的做法是在函數(shù)最后delete掉這塊內(nèi)存,或是返回這塊內(nèi)存的地址以供繼續(xù)使用。}// 函數(shù)體結(jié)束。// 注意,程序員手動申請了一塊空間,這400字節(jié)的內(nèi)存創(chuàng)建于堆上。int buffer[100]。int num = 100。// 此時除了它自身作為一個變量需要占用4字節(jié)的空間(指針都占4字節(jié)),沒有任何其他空間被申請。// 上行代碼是個重點。所以程序中是p1而不是p+1。}上述代碼的結(jié)果是:5 3 7從結(jié)果中我們可以看出兩件事:一是棧地址是連續(xù)的,我們可以通過一個指針和一個相對的大小,來“偏移”到別的變量上去。getchar()。printf(“%dn”, *(p2))。printf(“%dn”, *p)。int *p = amp。int j = 3。純粹的文字描述顯得枯燥無味,我們來看一些代碼:[cpp] view plaincopyprint?include using namespace std。也就是說棧的存儲空間是從高地址走向低地址的。不過這并不是什么大問題,具體詳見“操作系統(tǒng)”的有關(guān)知識。而堆不同,大量申請和釋放小內(nèi)存塊可能會造成內(nèi)存問題,這些小的內(nèi)存塊零散的分布在內(nèi)存中,導(dǎo)致后續(xù)大塊的內(nèi)存申請失敗,因為雖然空閑的內(nèi)存足夠多,但是并不連續(xù)。在堆上分配內(nèi)存的做法則是從當前空閑的內(nèi)存中找一塊滿足大小的區(qū)域,就像鏈表的工作方式一樣。堆并沒有固定的容量上限,它與當前的剩余內(nèi)存量有關(guān)(其實還不準確,操作系統(tǒng)還有虛擬內(nèi)存或其他概念,所以堆的工作方式較為抽象)。、函數(shù)參數(shù),函數(shù)內(nèi)的局部變量等。,棧在函數(shù)結(jié)束的時候會自行釋放掉空間。既然提到共享,那么這里就有“并行存取”的問題了。那說明內(nèi)存也爆了。,比如dfs寫搓了。,因為棧要連續(xù)占用一段空間。接下來本來是想將棧和堆分開進行陳述,斟酌了一下還是決定從同一方面對棧和堆進行比較。堆則要首先在內(nèi)存的空閑區(qū)域?qū)ふ液线m的內(nèi)存空間,然后占用,然后指向這塊空間。由于棧的工作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧,堆的工作方式類似于鏈表,所以棧顯然會比堆快得多。在應(yīng)用程序啟動的時候,設(shè)置了堆的大小。每個線程都有一個屬于自己的棧,但每一個應(yīng)用程序通常只有一個堆(一個應(yīng)用程序使用了多個堆的情況也是有的)。堆是為動態(tài)分配預(yù)留的內(nèi)存空間,其生命周期為整個應(yīng)用程序的生命周期。操作系統(tǒng)中的堆與數(shù)據(jù)結(jié)構(gòu)中的堆完全不同。操作系統(tǒng)中的堆:由程序員手動進行內(nèi)存的申請與釋放。棧是為了執(zhí)行線程留出的內(nèi)存空間。從上面的講述中大概理清了最初三個問,希望高人能再補充一些您覺得重要的知識點,謝謝!第二篇:堆和棧全面的總結(jié)操作系統(tǒng)中的棧:由編譯器自動分配和自動釋放,一個函數(shù)對應(yīng)一個棧,用于存放函數(shù)的參數(shù)值、函數(shù)調(diào)用完成后的返回值和函數(shù)體內(nèi)的局部變量等。應(yīng)用程序在運行中所創(chuàng)建的所有類實例或數(shù)組都放在這個堆中,++不同,Java中分配堆內(nèi)存是自動初始化的。,這個幀將用來保存參數(shù),局部變量,堆棧又可以這樣理解:堆棧(Stack)是操作系統(tǒng)在建立某個進程時或者線程(在支持多線程的操作系統(tǒng)中是線程)為這個線程建立的存儲區(qū)域,該區(qū)域具有先進后出的特性。我們知道,當前方法使用的幀稱為當前幀。堆棧以幀為單位保存線程的狀態(tài)。事實上,面向?qū)ο蟮亩鄳B(tài)性,堆內(nèi)存分配是必不可少的,++中,要求創(chuàng)建一個對象時,只需用 new命令編制相關(guān)的代碼即可。靜態(tài)存儲分配要求在編譯時能知道所有變量的存儲要求,棧式存儲分配要求在過程的入口處必須知道所有的存儲要求,而堆式存儲分配則專門負責(zé)在編譯時或運行時模塊入口處都無法確定存儲要求的數(shù)據(jù)結(jié)構(gòu)的內(nèi)存分配, 堆和棧的比較上面的定義從編譯原理的教材中總結(jié)而來,除靜態(tài)存儲分配之外,都顯得很呆板和難以理解,下面撇開靜態(tài)存儲分配
點擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1