① C#中靜態的結構體,存儲在什麼地方,是棧還是堆,還是什麼
「值類型存儲在棧中, 引用類型存儲在堆中」
這句話的前半句是有爭議的,
「變數的值是在它聲明的位置存儲的,假如一個類中有一個int類型的實例變數,那麼在這個類的任何對象中,該變數的值總是和對象中的其他數據在一起,也就是在堆上,只有局部變數(方法內部聲明的變數)和方法參數在棧上。而對於C#2以及更高版本,很多局部變數並不完全存放在棧中」引用-《C# in depth》及譯本《深入理解C#》
② c#什麼是值類型什麼是引用類型
一、數據類型在它自己的內存分配中存儲數據,則該數據類型就是「值類型」。值類型包括:
1、所有數字數據類型
2、Boolean、Char和Date
3、所有結構,即使其成員是引用類型
4、枚舉,因為其基礎類型總是SByte、Short、Integer、Long、Byte、UShort、UInteger或ULong
二、「引用類型」包含指向存儲數據的其他內存位置的指針。引用類型包括:
1、String
2、所有數組,即使其元素是值類型
3、類類型,如Form
4、委託
(2)值類型存儲在堆棧擴展閱讀
值類型和引用類型使用注意事項
值類型的變數保存到內存的線程的堆棧中;而引用類型的變數會保存到託管堆中,其中這里說的託管堆又可以分為GC堆、LOH堆。其中GC堆、LOH堆是根據創建的對象的大小來分配到不同的堆中的。
判斷的平衡點是這個對象是否超過85000位元組,如果小於85000位元組,則系統把對象保存到GC堆中;如果大於或者等於85000位元組,則系統保存到LOH堆中(一般LOH創建的對象是數組)。所以託管堆就是指GC堆和LOH堆的集合。
③ 堆與棧在內存里是怎麼分配的
堆和棧的區別(內存和數據結構)
在計算機領域,堆棧是一個不容忽視的概念,我們編寫的C語言程序基本上都要用到。但對於很多的初學著來說,堆棧是一個很模糊的概念。堆棧:一種數據結構、一個在程序運行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這么想的和匯編語言中的堆棧一詞混為一談。我身邊的一些編程的朋友以及在網上看帖遇到的朋友中有好多也說不清堆棧,所以我想有必要給大家分享一下我對堆棧的看法,有說的不對的地方請朋友們不吝賜教,這對於大家學習會有很大幫助。
數據結構的棧和堆
首先在數據結構上要知道堆棧,盡管我們這么稱呼它,但實際上堆棧是兩種數據結構:堆和棧。
堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
內存分配中的棧和堆
然而我要說的重點並不在這,我要說的堆和棧並不是數據結構的堆和棧,之所以要說數據結構的堆和棧是為了和後面我要說的堆區和棧區區別開來,請大家一定要注意。
下面就說說C語言程序內存分配中的堆和棧,這里有必要把內存分配也提一下,大家不要嫌我啰嗦,一般情況下程序存放在Rom或Flash中,運行時需要拷到內存中執行,內存會分別存儲不同的信息,如下圖所示:
內存中的棧區處於相對較高的地址以地址的增長方向為上的話,棧地址是向下增長的。
棧中分配局部變數空間,堆區是向上增長的用於分配程序員申請的內存空間。另外還有靜態區是分配靜態變數,全局變數空間的;只讀區是分配常量和程序代碼空間的;以及其他一些分區。
④ C#中值類型和引用類型分別放在堆棧裡面的什麼地方
值類型的值就是存儲在棧中啊
引用類型是將存放本身的值存放在堆中
引用類型是將存放本身的值的地址存放在棧中,根據這個地址可以去找到自己
⑤ C#值類型和引用類型,堆和堆棧的區別
C#中值類型和引用類型
概念:
1.值類型:數據存儲在內存的堆棧中,從堆棧中可以快速地訪問這些數據,因此,值類型表示實際的數據。
2.引用類型:表示指向存儲在內存堆中的數據的指針或引用(包括類、介面、數組和字元串)。
C#中定義的值類型包括原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚舉(enum)、結構(struct)
引用類型包括:類、數組、介面、委託、字元串等。
區別:
基本區別在於它們在內存中的存儲方式。值類型只將值存放在內存中,這些值類型都存儲在堆棧中。原始數據類型(如bool和int)都屬於此類型。而引用類型的內存單元中只存放內存堆中對象的地址,而對象本身放在內存堆中。如果引用的值類型的值是null,則表示未引用任何對象。
堆和堆棧區別:
堆和堆棧是兩個不同的概念,在內存中的存儲位置也不相同,
堆一般用於存儲可變長度的數據,如字元串類型;
堆棧則用於存儲固定長度的數據,如整型類型的數據int(每個int變數佔用四個位元組)。由數據存儲的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆棧中保存兩個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆棧中保存對同一個堆位置的兩個引用,即在堆棧中保存的是同一個堆的地址。在進行數據操作時,對於值類型,由於每個變數都有自己的值,因此對一個變數的操作不會影響到其它變數;對於引用類型的變數,對一個變數的數據進行操作就是對這個變數在堆中的數據進行操作,如果兩個引用類型的變數引用同一個對象,實際含義就是它們在堆棧中保存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個對象的另一個變數。
⑥ 1.net中堆棧和棧是一樣的嗎 2.假如第一個問題是錯誤的,那麼值類型變數存儲在堆棧還是棧中
堆和棧是不一樣的~在棧中
⑦ c#值類型和引用類型
1,值類型:數據存儲在內存的堆棧中,從堆棧中可以快速地訪問這些數據,因此,值類型表示實際的數據。
2,引用類型:表示指向存儲在內存堆中的數據的指針或引用(包括類、介面、數組和字元串)。
C#中定義的值類型包括原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚舉(enum)、結構(struct)
引用類型包括:類、數組、介面、委託、字元串等。
區別:
基本區別在於它們在內存中的存儲方式。值類型只將值存放在內存中,這些值類型都存儲在堆棧中。原始數據類型(如bool和int)都屬於此類型。而引用類型的內存單元中只存放內存堆中對象的地址,而對象本身放在內存堆中。如果引用的值類型的值是null,則表示未引用任何對象。
堆和堆棧區別:
堆和堆棧是兩個不同的概念,在內存中的存儲位置也不相同,
堆一般用於存儲可變長度的數據,如字元串類型;
堆棧則用於存儲固定長度的數據,如整型類型的數據int(每個int變數佔用四個位元組)。由數據存儲的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆棧中保存兩個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆棧中保存對同一個堆位置的兩個引用,即在堆棧中保存的是同一個堆的地址。在進行數據操作時,對於值類型,由於每個變數都有自己的值,因此對一個變數的操作不會影響到其它變數;對於引用類型的變數,對一個變數的數據進行操作就是對這個變數在堆中的數據進行操作,如果兩個引用類型的變數引用同一個對象,實際含義就是它們在堆棧中保存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個對象的另一個變數。
⑧ C#中結構的值存儲在內存的什麼地方
結構屬於值類型,存放在棧上
⑨ 類中的值類型存儲在棧還是堆中
說法沒錯,引用類型在堆上,值類型在棧上。不過這種說法很是籠統不易理解,其實簡單來說值類型就是保存實際的值,引用類型就是指向一個存有值的一個地址
⑩ 「==」和「equals」的區別
java中equals和==的區別 值類型是存儲在內存中的堆棧(簡稱棧),而引用類型的變數在棧中僅僅是存儲引用類型變數的地址,而其本身則存儲在堆中。
==操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中存儲的地址是否相同,即棧中的內容是否相同。
equals方法(是String類從它的超類Object中繼承的)被用來檢測兩個對象是否相等,即兩個對象的內容是否相等,區分大小寫。
常用於網路,由兩個等於號組成,但要注意與代"等等"的"=="區別開來。"=="中間是沒有空格的。