#realJSOP
Нет абсолютно точного способа определить размер экземпляра объекта, но этот код, показанный в этом примере, должен подойти вам довольно близко:
private static long GetObjectSize(object obj)
{
long size = 0;
using (Stream s = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, obj);
size = s.Length;
}
return size;
}
Я создал простой класс с двумя строковыми свойствами, а затем еще один класс, производный от первого, без каких-либо дополнительных свойств/кода/полей.
Не производная версия (с кодом выше) показала 202 байта.
Производная версия показала 225 байт.
Существует некоторое дополнительное потребление памяти (и этого следует ожидать), но я оставляю вам решать, является ли увеличенное потребление памяти линейным или геометрическим с более сложными базовыми классами.
В конце концов, это действительно не имеет значения. Вы не должны код (неверный/померещилось?) оптимизация памяти за счет ремонтопригодности.
Если вас интересует распределение памяти в .Net, просто погуглите его и читайте до тех пор, пока вы можете поддерживать интерес к этой теме.
Я забыл упомянуть, что код, который я предоставил, будет работать только в том случае, если классы, о которых идет речь, имеют
[Serializable]
примененный атрибут.
РЕДАКТИРОВАТЬ ==================================
После некоторого беглого тестирования создается впечатление, что длина имен объектов (а также имена их свойств и методов) является определяющим фактором в том, сколько дополнительной памяти выделяется производному классу. Кроме того, несмотря на это, объем дополнительной памяти, потребляемой наследующим классом (учитывая мои очень простые классы), кажется достаточно статичным процентом (около 11%).