[英]Memory Allocation for an Array of Struct and Class Object
最后一天,我正在閱讀C#參考,在那里我看到了一個聲明。 請看以下聲明。
語境:
對於Point使用結構而不是類可以在運行時執行的內存分配數量有很大差異。 下面的程序創建並初始化一個包含100個點的數組。 將Point實現為類,實例化101個單獨的對象 - 一個用於數組,一個用於100個元素。
class Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
如果將Point實現為結構,如
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
實例化只有一個對象 - 數組的對象。 Point實例在數組中內聯分配。 這種優化可能被濫用。 使用結構而不是類也可以使應用程序運行得更慢或占用更多內存,因為按值傳遞結構實例會導致創建該結構的副本。
問題:我的問題是如何在值類型和參考類型的情況下完成內存分配?
混淆:為什么在參考指南中提到只有一個對象將被初始化。 根據我對Array中每個對象的理解,將分配一個單獨的內存。
編輯:可能重復此問題與jason建議的可能重復的問題略有不同。 我關心的是如何僅在值類型和參考類型的情況下分配內存,而該問題只是解釋值類型和參考類型的概述。
也許通過插圖更容易理解引用類型數組和值類型數組之間的區別:
每個Point
以及數組都在堆上分配,數組存儲對每個Point
引用。 總共需要N + 1個分配,其中N是點數。 您還需要額外的間接訪問特定Point
的字段,因為您必須通過引用。
每個Point
都直接存儲在數組中。 堆上只有一個分配。 訪問字段不涉及間接。 字段的內存地址可以直接從數組的內存地址,數組中項的索引以及值類型中字段的位置計算。
具有引用類型的數組將由引用數組組成。 每個引用指向包含實際對象的內存區域:
array[0] == ref0 -> robj0
array[1] == ref1 -> robj1
...
因此,引用數組有一個內存分配(size:arraylength * sizeof(reference)),每個對象有一個單獨的內存分配(sizeof(robj))。
具有值類型(如結構)的數組將僅包含對象:
array[0] == vobj0
array[1] == vobj1
...
所以有jst一個內存分配大小arraylength * sizeof(vobj)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.