Почему мой класс занимает так много места в памяти?

У меня будут буквально десятки миллионов экземпляров некоторого класса MyClass, и я хочу минимизировать размер его памяти. Вопрос об измерении того, сколько места занимает объект в памяти, обсуждался в Определение размера объекта .net Я решил последовать совету Джона Скита, и это мой код:

   // Edit: This line is "dangerous and foolish" :-) 
   // (However, commenting it does not change the result)
   // [StructLayout(LayoutKind.Sequential, Pack = 1)]
   public class MyClass       
   {
      public bool isit;
      public MyClass nextRight;
      public MyClass nextDown;
   }

   class Program
   {
      static void Main(string[] args)
      {
         var a1 = new MyClass(); //to prevent JIT code mangling the result (Skeet)
         var before = GC.GetTotalMemory(true);   
         MyClass[] arr = new MyClass[10000];
         for (int i = 0; i < 10000; i++)
            arr[i] = new MyClass(); 

         var after = GC.GetTotalMemory(true);

         var per = (after - before) / 10000.0;
         Console.WriteLine("Before: {0} After: {1} Per: {2}", before, after, per);
         Console.ReadLine();
      }
   }

Я запускаю программу в 64-битной Windows, выбираю «выпуск», цель платформы: «любой процессор» и выбираю «оптимизировать код» (только варианты имеют значение если я явно нацелен на x86) Результат, к сожалению, 48 байт на экземпляр.

По моим расчетам, каждая ссылка будет равна 8 байтам, плюс 1 байт для типа bool плюс около 8 байт служебных данных. Что здесь происходит? Это заговор для того, чтобы поддерживать высокие цены на оперативную память и / или допускать раздутие кода сторонних производителей? Хорошо, хорошо, я думаю, что мой настоящий вопрос: что я делаю не так, или как мне уменьшить размер MyClass?

Edit: Прошу прощения за небрежность в моем вопросе, я отредактировал пару имен идентификаторов. Моей конкретной и непосредственной задачей было построить «двумерный связанный список» как реализацию разреженной логической матрицы, в которой я мог бы легко получить перечисление установленных значений в заданной строке / столбце.[Конечно, это означает, что я также должен хранить координаты x, y в классе, что делает мою идею еще менее осуществимой]

7
задан Community 23 May 2017 в 12:03
поделиться