堆和栈、值类型与引用类型、装箱与拆箱
堆棧:內(nèi)存條里的某一塊。
電腦中有6個地方可以保存數(shù)據(jù)。
<1>寄存器:保存最快。這東西在處理器內(nèi)部。也就是CPU里的一小塊地方給你放數(shù)據(jù)。既然是CPU,那么主要工作是計算,所以這塊寄存器能放的東西十分有限,寄存器是由編譯器分配。我們的程序里看不到的。
<2>棧:在RAM(隨機(jī)訪問存儲器,就是內(nèi)存)區(qū)域。通過操作堆棧指針可以直接操作這部分內(nèi)存,例如,指針下移,創(chuàng)建新內(nèi)存,上移,釋放。這邊所說的棧,嚴(yán)格說是棧,不是堆棧。堆棧是2個東西,創(chuàng)建程序時編譯器需要知道從棧里分配多少存儲空間,比較不自由。在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
<3>堆:也在RAM中。區(qū)別于棧就是堆不需要知道創(chuàng)建對象時需要從堆里分配多大的存儲空間,也不知道存儲多長時間。常和new一個對象相關(guān)。堆的大小受限于計算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。
<4>靜態(tài)存儲:也在RAM中,但是位于固定位置。程序運(yùn)行時,固定位于一段存儲空間里。通常用關(guān)鍵字static。
<5>常數(shù)存儲:常數(shù)值通常直接放在程序代碼內(nèi)部。永遠(yuǎn)都不會改變。通常用關(guān)鍵字readonly。
<6>非RAM存儲。如程序外部的一個流式對象,該對象變成字節(jié)流,通常發(fā)給另一臺機(jī)器。或者是一個固定對象,就是硬盤等上的固定對象。這些都可以變成RAM中的對象,如將一個圖片轉(zhuǎn)換成filestream。
看完上面,大概就知道了堆和棧其實(shí)就是內(nèi)存里的兩種數(shù)據(jù)結(jié)構(gòu)。
棧只能在棧頂對數(shù)據(jù)進(jìn)行插入和刪除,先進(jìn)后出,后進(jìn)先出。堆得話順序就隨意了。
棧區(qū)stack由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值,操作方式類似數(shù)據(jù)結(jié)構(gòu)中的棧。
堆區(qū)(heap)— 由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。
這是一個前輩寫的,非常詳細(xì)
//main.cpp
int a = 0; 全局初始化區(qū)
char *p1; 全局未初始化區(qū)
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區(qū),p3在棧上。
static int c =0; 全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
}
堆和棧中的存儲內(nèi)容
棧: 在函數(shù)調(diào)用時,第一個進(jìn)棧的是主函數(shù)中函數(shù)調(diào)用后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址,然后是函數(shù)的各個參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的,然后是函數(shù)中的局部變量。注意靜態(tài)變量是不入棧的。
當(dāng)本次函數(shù)調(diào)用結(jié)束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地址,也就是主函數(shù)中的下一條指令,程序由該點(diǎn)繼續(xù)運(yùn)行。
堆:一般是在堆的頭部用一個字節(jié)存放堆的大小。堆中的具體內(nèi)容有程序員安排。
堆棧是一種存儲部件,即數(shù)據(jù)的寫入跟讀出不需要提供地址,而是根據(jù)寫入的順序決定讀出的順序
值類型與引用類型
值類型吧,我感覺就是可以直接賦值的。而引用類型大部分是通過實(shí)例來進(jìn)行操作的。
值類型和引用類型最根本的區(qū)別是:兩者在內(nèi)存中的分配位置不同,值類型(Value Type)的實(shí)例分配在線程的棧上,而引用類型(Reference Type)的實(shí)例總是從托管堆上分配內(nèi)存。
值類型變量直接存儲數(shù)據(jù)值,所以需要知道需要多大空間。
引用類型以new創(chuàng)建對象實(shí)例,并存儲在堆中,并不需要知道確切需要多大空間。static class 是使用靜態(tài)內(nèi)存。不在堆棧中。
裝箱和拆箱
將值類型轉(zhuǎn)換為引用類型叫裝箱。反之叫拆箱。引用類型就是個箱子,能把值裝進(jìn)去。
int i = 9;
obj j = i;? //裝箱。
轉(zhuǎn)載于:https://blog.51cto.com/feelmanc/1250534
總結(jié)
以上是生活随笔為你收集整理的堆和栈、值类型与引用类型、装箱与拆箱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux CentOS 查看服务器信息
- 下一篇: 神啊,6小时30分钟,完成想要的所有Ly