[c#] 在結構上使用“新”是否將它分配到堆或棧上?



Answers

包含struct字段的內存可以根據具體情況分配在堆棧或堆上。 如果struct-type變量是某個匿名委託或迭代器類未捕獲的局部變量或參數,則它將被分配到堆棧上。 如果變量是某個類的一部分,那麼它將在堆中的類中分配。

如果結構被分配在堆上,那麼調用new運算符實際上並不是分配內存所必需的。 唯一的目的是根據構造函數中的內容設置字段值。 如果構造函數沒有被調用,那麼所有的字段將得到它們的默認值(0或null)。

同樣,對於在堆棧中分配的結構,除了C#要求所有局部變量在使用前都設置為某個值之外,因此您必須調用自定義構造函數或默認構造函數(不帶參數的構造函數始終可用於結構)。

Question

當你用new操作符創建一個類的實例時,內存將被分配到堆上。 當你使用new運算符創建一個結構實例時,內存分配的位置,堆或堆棧上?




classstruct聲明就像是用於在運行時創建實例或對象的藍圖。 如果您定義了一個名為Person的classstruct ,Person就是該類型的名稱。 如果聲明並初始化Person類型的變量p,則稱p為Person的對像或實例。 可以創建同一Person類型的多個實例,並且每個實例在其propertiesfields可以具有不同的值。

一個class是一個引用類型。 當class一個對像被創建時,該對像被分配到的變量只保存對該內存的引用。 將對象引用分配給新變量時,新變量引用原始對象。 通過一個變量所做的更改反映在另一個變量中,因為它們都指向相同的數據。

struct是一個值類型。 當一個struct被創建時, struct被分配的變量保存結構的實際數據。 當struct被分配給一個新的變量時,它被複製。 因此新變量和原始變量包含相同數據的兩個獨立副本。 對一個副本所做的更改不會影響其他副本。

通常, classes用於建模更複雜的行為,或用於在創建class對像後修改的數據。 Structs最適合小數據結構,主要包含在創建struct後不打算修改的數據。

更多...




結構被分配給堆棧。 這是一個有用的解釋:

Structs

此外,在.NET中實例化的類會在堆或.NET的保留內存空間上分配內存。 鑑於由於堆棧上的分配而實例化時,結構會產生更高的效率。 此外,應該注意的是,在結構中傳遞參數是通過值來完成的。




與所有值類型一樣,結構總是在聲明的位置

有關何時使用結構的更多詳細信息,請參閱here的問題。 這裡的這個問題有關結構的更多信息。

編輯:我錯誤地回答說,他們總是在堆棧中。 這是incorrect




Related