Использование памяти в .NET при создании нового класса или структуры

Int имеет размер 4 байта, если я создам новый Int в моей программе, он будет потреблять память на 4 байта. Правильно?

Но если у меня есть этот класс

public class Dummy{
    private int;
}

Сколько памяти будет использовать мой новый класс? Будет ли потребление памяти ниже, если это была структура? Я думаю, что сама ссылка также будет потреблять некоторую память.

Ответ 1

Одна ссылка либо занимает 4 байта в 32-битных процессах, либо 8 байтов в 64-битных процессах. Ссылка - это стандартная служебная нагрузка на классы (поскольку они являются ссылочными типами). Структуры не содержат ссылок (ну, игнорируя любой потенциальный бокс) и обычно являются их содержимым. Я не могу вспомнить, имеют ли классы дополнительные накладные расходы, не думайте так.

Этот вопрос затрагивает класс vs struct (также представленный в комментариях к вопросу):

Использует ли "новый" на структуре выделяете его в кучу или стек?

Как указано в комментариях, только экземпляры класса будут использовать эту служебную информацию и только тогда, когда есть ссылка. Когда ссылок нет, элемент становится доступным для GC - я не уверен, какой размер класса находится в куче без каких-либо ссылок, я бы предположил, что это размер его содержимого.

Действительно, классы не имеют истинного "размера", на который можно положиться. И наиболее важно, это не должно быть решающим фактором при использовании классов или структур (но вы склонны находить рекомендации о том, что типы на уровне или ниже примерно 16 байтов могут быть подходящими структурами, а выше имеет тенденцию к классам). Для меня решающим фактором является использование.

Когда я говорю о структурах, я чувствую себя обязанным предоставить следующую ссылку: Почему изменчивые структуры "злые" ?

Ответ 2

Класс является ссылочным типом и находится кучей (и будет удален из сборщика garbabe). Тип значения struct ist и сохраняется в стеке.
В случае вашего примера Microsoft рекомендует тип значения (struct), потому что ссылочный тип вызывает слишком много накладных расходов.

Если вам интересна эта тема, посмотрите на книгу "CLR via С#" от Джеффри Рихтера.