Member 13867825 Ответов: 3

Схема наследования памяти в языке Си#


какова будет память, выделенная в куче, если будет создан объект производного класса?
Выделяется ли память производному классу или она включает в себя память и для базового класса?
Если да, то что, если я последовательно выведу 10 раз?
Разве это не влияет на производительность программы?
Я имею в виду, что память из 10 классов должна быть создана, если я вызову последний производный класс. Разве это не накладные расходы на производительность? пожалуйста, объясните точную схему распределения памяти

Что я уже пробовал:

это концептуальный вопрос. таким образом, я не мог найти никакого способа для реализации какой-либо стратегии

Richard MacCutchan

Вы можете найти ответ, создав несколько классов и объектов и проверив их размер во время выполнения.

3 Ответов

Рейтинг:
2

#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%).


BillWoodruff

+5

Рейтинг:
1

Gerry Schmitz

Нет, существует только "один" экземпляр "конечного" производного класса.

Не существует "промежуточных" производных классов, "скованных" вместе.

Подумайте о "подклассах" (в некотором смысле) как о "логическом" вырезании и вставке функциональности из связанного, более примитивного класса.


Рейтинг:
0

BillWoodruff

Вы можете подумать о базовом классе и классах, которые происходят от базового класса, либо непосредственно, или происходят из класса, который имеет базовый класс как его корневой предок ...

как быть а производственная линия: каждый раз, когда вы создаете пример класса: различные части производственной линии вызываются в "действие", чтобы произвести экземпляр.

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

Я думаю, что при изучении ООП полезно сосредоточиться на разнице между объявлением структуры ... создание классов, интерфейсов, структур ... и создание экземпляра этой структуры в пригодные для использования объекты run-tine.

Класс-это синяя печать для "дома": создание экземпляра-это процесс строительства дома; сколько дом "стоит" - это функция стоимости его материалов и труда.