日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆和栈、值类型与引用类型、装箱与拆箱

發(fā)布時間:2025/3/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆和栈、值类型与引用类型、装箱与拆箱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

堆棧:內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。