У каждого экземпляра класса или структуры есть личное пространство памяти для данных, но методы совместно используются для всех объектов один раз.
Во-первых, вам нужно 4 байта на x32 или 8 байт на x64, чтобы хранить ссылку на адрес памяти объекта (ссылка — это скрытый указатель, чтобы забыть об управлении).
Далее, у объекта есть два члена данных:
- Одно целое, занимающее 4 байта.
- Одна строка, которая здесь занимает 5 символов: 5x2 байта = 10 байт.
Таким образом, для данных объект занимает 18 байт в системе x32 или 22 байта в системе x64.
Поскольку строковый объект содержит целое число для длины, размер немного больше: 22 на x32 и 26 на x64.
Поскольку строка является ссылкой, нам нужно снова добавить 4 или 8 байтов => 26 или 34 байта.
Поскольку строка имеет некоторые другие статические поля и поля экземпляра в объявлении класса, такие как первый char, требуется немного больше, чем это.
Является ли строка на самом деле массивом символов или у нее просто есть индексатор?
Кроме того, в памяти в сегменте кода находятся инструкции кода методов. Этот код общий для всех экземпляров.
Кроме того, существуют таблицы классов и виртуальные таблицы для описания типов, сигнатур методов и правил полиморфизма.
Если объект создается в методе, он использует динамическую память.
Если объект создается в объявлении как член класса, я не знаю, как работает .NET, но он может быть размещен в сегменте данных процесса.
А память подобна поезду, где вагоны — это байты.
Вот псевдосхема памяти.
Это не совсем истинная реальность, но она может помочь понять:
![введите здесь описание изображения](https://i.stack.imgur.com/IVrBm.png)
При доступе к переменной в классе C# весь класс считывается из памяти?
C# Heap(ing) Сравнение со стекированием в .NET
Байт — это элементарная единица памяти, в которой одновременно хранится одно значение в диапазоне от 0 до 255 (без знака) или от -128 до +127 (со знаком).
Изучите основы переменных типов данных C#.
Сдвиг поведения для целых чисел со знаком
Учебник по представлению данных
Увидев этот набросок сегодня (2021.01.28), я понимаю, что он может вводить в заблуждение, и именно поэтому я написал Это не совсем истинная реальность, но может помочь понять, потому что на самом деле код реализация методов загружается из бинарных файлов EXE и DLL при запуске процесса и сохраняется в СЕГМЕНТЕ КОДА, так как все данные, статические (литералы) и динамические (экземпляры) находятся в СЕГМЕНТЕ ДАННЫХ (если ничего не изменилось со времен x32 и защищенного режима). Не виртуальные таблицы методов, а также виртуальные таблицы методов не хранятся в сегменте данных для каждого экземпляра объектов. Я не помню подробностей, но эти таблицы для кода. Также данные каждого экземпляра объекта являются проекцией его определения, а также его предков, в одном месте, один полный экземпляр.
Сегментация памяти
сегментация памяти x86
person
Olivier Rogier
schedule
14.10.2019