Модель памяти (класс против структур) - PullRequest
0 голосов
/ 23 октября 2018

Недавно читал несколько книг о модели памяти для ядра .net и у меня все еще есть вопрос без ответа, который, я надеюсь, кто-то уже знает ответ и может поделиться этим с остальными.

Итак - простой тест:1. Создан простой класс «MyType» с 3 реквизитами:

int a;
int b;
double c;

Сейчас - я создал список, зарезервировал 1000.000 элементов и заполнил его:

        List<MyType> someList = new List<MyType>(1000000);

        for (int i = 0; i < 1000000; i++)
        {
            someList.Add(new MyType());
        }

Итак - теперь, если яиспользуйте класс для объявления «MyType» - программа потребляет 42 МБ памяти.При использовании struct - потребляет 25 МБ.Зная, что класс находится в куче и что сборка x86 Release, каждый из моих объектов, хранящихся в куче, должен иметь служебную память хранилища адресов в 4 байта.Таким образом, 1 миллион объектов должен создать 4 МБ «накладных расходов».Поэтому я ожидаю, что классы будут использовать 29 МБ, а не 42 МБ.Так что здесь должно быть что-то еще ... это именно тот вопрос, который я хотел бы задать.

Спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

Вы не учитываете размер заголовка объекта, который составляет 8 байт на объект в x86;так что это еще 8 МБ;29 + 8 = 37, что ближе;затем добавьте некоторые отступы в области выделения.

Заголовок объекта - это метаданные, которые располагаются перед в каждом экземпляре object, выделенном для кучи, чтобы сказать, что это за тип, и т. д.

Структура (если она не упакована и т. Д.) Не имеет заголовка объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...