У меня будут буквально десятки миллионов экземпляров некоторого класса 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 в классе, что делает мою идею еще менее осуществимой]