埋堆堆app官網下載 ios內存中的棧和堆的區(qū)別是什么?那些數(shù)據在棧上,在堆上?
ios內存中的棧和堆的區(qū)別是什么?那些數(shù)據在棧上,在堆上?IOS中堆與棧的區(qū)別管理方法:對于棧,由編譯器自動管理,無需我們的手動控制;對于棧,發(fā)布工作由程序員控制,容易產生內存泄漏。應用程序大小:堆棧
ios內存中的棧和堆的區(qū)別是什么?那些數(shù)據在棧上,在堆上?
IOS中堆與棧的區(qū)別
管理方法:
對于棧,由編譯器自動管理,無需我們的手動控制;對于棧,發(fā)布工作由程序員控制,容易產生內存泄漏。
應用程序大小:
堆棧:在windows中,堆棧是擴展到低地址和連續(xù)內存區(qū)域的數(shù)據結構。堆棧頂部的地址和堆棧的最大容量由系統(tǒng)預先確定。在windows下,堆棧的大小是2m(或1m,編譯器確定的常量)。如果應用的空間超過堆棧的剩余空間,它將溢出。因此,獲得堆棧的空間很小。
堆:堆是一種擴展到高地址的數(shù)據結構,高地址是一個不連續(xù)的內存區(qū)域。這是因為系統(tǒng)使用鏈表存儲空閑內存地址,這種地址自然是不連續(xù)的,鏈表的遍歷方向是從低位地址到高位地址。堆的大小受到計算機系統(tǒng)中可用虛擬內存的限制??梢钥闯?,堆獲得的空間比較靈活和大。
碎片問題:
對于堆來說,頻繁的新建/刪除勢必造成內存空間的不連續(xù)性,導致大量碎片,降低程序的效率。對于堆棧,不會有這個問題,因為堆棧是一個先進后出隊列,它們是一對一的對應關系,因此永遠不會有內存從堆棧中彈出。
分配方法:
堆是動態(tài)分配的,沒有靜態(tài)分配的堆。堆棧分配有兩種方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是由編譯器完成的,比如局部變量的分配。動態(tài)分配是通過alloc函數(shù)來分配的,但棧的動態(tài)分配不同于堆的動態(tài)分配。它的動態(tài)分配是由編譯器發(fā)布的,所以我們不需要手動實現(xiàn)它。
分配效率:
堆棧是機器系統(tǒng)提供的數(shù)據結構。計算機將在底層堆棧中提供支持,分配專門的寄存器來存儲堆棧的地址,將堆棧從堆棧中壓出,并有專門的指令來執(zhí)行,這就決定了堆棧的效率相對較高。堆是由C/C函數(shù)庫提供的,其機制非常復雜。
String存放在堆中還是棧中?
有問題的字符串應該是指Java中的字符串。這里的答案是Java。
字符串是一個不可變的對象,在Java中只能用作常量。Java代碼中的所有顯式字符串,即直接編寫的字符串,如“ABC”,都是字符串對象。字符串本身作為一個對象,必須在堆上,而字符串的內容char[]value則放在堆常量區(qū)域的一個特殊區(qū)域中。
所以字符串本身就是放在堆上的,根據垃圾收集的情況,它可以分為新一代和老一代。如果字符串對象剛剛創(chuàng)建,它通常位于新一代堆中。如果已經創(chuàng)建了很長時間,很可能是在舊堆時代。請注意,字符串中的字符串內容(即字符數(shù)組值)位于堆的常量區(qū)域中。如果首先有一個字符數(shù)組,例如char[]arr{“a”、“b”、“c”},然后調用String s=new String(arr)來創(chuàng)建該字符串,那么字符數(shù)組就不再位于常量區(qū)域,而是與堆上的其他對象類似。請注意,即使在堆棧上分配了ARR數(shù)組,以這種方式創(chuàng)建的字符串中的值仍在堆上。如果你想把這個字符串放在常量區(qū)域,你可以調用String.實習生.
堆棧上沒有對象,只有基本變量和引用變量,因此字符串只能在堆上,而不能在堆棧上。