Выделение памяти для массива объектов Struct и Class


Вчера я читал ссылку на C# и там я увидел заявление. Пожалуйста, взгляните на следующее утверждение.

Контекст:

Использование структуры, а не класса для точки может привести к большой разнице в количестве выделение памяти выполняется во время выполнения. Приведенная ниже программа создает и инициализирует массив из 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);
      }
}

Если точка вместо этого реализуется как структура, как в

struct Point
{
     public int x, y;
     public Point(int x, int y) {
         this.x = x;
         this.y = y;
     }
}

Создается экземпляр только одного объекта-объекта для массива. Точечные экземпляры распределяются в строке в пределах массив. Эта оптимизация может быть использована не по назначению. Использование структур вместо классов также может замедлить работу приложения или занять больше памяти, так как передача экземпляра структуры по значению приводит к тому, что копия этой структуры будет созданный.

Вопрос: Здесь мой вопрос заключается в том, как происходит выделение памяти в случае типа значения и ссылочного типа?

Путаница: Почему в справочнике упоминается, что только 1 объект будет интиализирован. В моем понимании для каждого объекта в массиве будет выделена отдельная память.

Редактировать: Возможный Дубликат Этот вопрос немного отличается от возможного дублирующего вопроса, предложенного Джейсоном. Меня волнует, как работает память. выделяется в случае типа значения и Referenece типа исключительно в то время как этот вопрос просто объяснить обзор типа значения и ссылочного типа.

2 4

2 ответа:

Возможно, различие между массивом ссылочного типа и массивом типа значения легче понять с помощью иллюстрации:

Массив ссылочного типа

Массив ссылочного типа

Каждый Point, а также массив выделяется в куче, и массив хранит ссылки на каждый Point. Всего нужно N + 1 распределений, где N-количество баллов. Вам также нужно дополнительное косвенное обращение, чтобы получить доступ к полю конкретного Point, потому что вы должны пройти через ссылка.

Массив типа значения

Массив типа значения

Каждый Point хранится непосредственно в массиве. В куче есть только одно распределение. Доступ к полю не предполагает косвенного обращения. Адрес памяти поля может быть вычислен непосредственно из адреса памяти массива, индекса элемента в массиве и местоположения поля внутри типа значения.

Массив ссылочных типов будет состоять из массива ссылок. Каждая ссылка указывает на область памяти, которая содержит фактический объект:

array[0] == ref0 -> robj0
array[1] == ref1 -> robj1
...
Таким образом, существует одно выделение памяти для массива ссылок (size: arraylength * sizeof(reference)) и отдельное выделение памяти для каждого объекта (sizeof(robj)).

Массив с типами значений (например, structs) будет содержать только объекты:

array[0] == vobj0
array[1] == vobj1
...

Таким образом, существует JST одно выделение памяти с размером arraylength * sizeof(vobj)