簡體   English   中英

結構和類對象數組的內存分配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM