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