|
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 7
|
|
Выделение памяти под int10.02.2015, 18:46. Показов 7408. Ответов 16
Метки нет (Все метки)
Добрый день!!
Недавно начал разбираться с С#. Есть теоретический вопрос: int (System.Int32) в памяти занимает 4 байта, ровно столько, сколько выделено под само число. Как такое может быть? Ведь это структура. Как это реализовано? Спасибо.
0
|
|
| 10.02.2015, 18:46 | |
|
Ответы с готовыми решениями:
16
Разработать таблицу имен, обеспечивающую динамическое выделение памяти под имена
|
|
|
|||
| 10.02.2015, 18:57 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 7
|
||||||
| 11.02.2015, 08:49 [ТС] | ||||||
|
Память должна выделяться как минимум под "MaxValue" и "MinValue" по 4 байта для каждого.
Cтруктура Int32:
0
|
||||||
|
foo();
|
|
| 11.02.2015, 09:17 | |
|
russov, min и max не зависят от экземпляра. Т.е. они не хранятся в каждой переменной типа int
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 7
|
|
| 11.02.2015, 11:16 [ТС] | |
|
Но если я создам свою такую же структуру "Int32_My" например, такой объект никак не 4 байта будет занимать. Пологаю здесь присутствует не сстандартное поведения для объектов стандартных типов. Возможно я не прав, если кто-то может, объясните на пальцах, как так получается. Большое спасибо.
min и max - они не статические, почему они не хранятся в каждой переменной.
0
|
|
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|
| 11.02.2015, 11:46 | |
|
russov, int - будет занимать в памяти ровно 4 байта. Для этого надо совершить экскурс во внутреннее устройство типов - это уровень объемной статьи, но если кратко:
ValueType - не имеют ни ссылки на таблицу виртуальных методов, ни индекса блока синхронизации, ни слова заголовка. Условно также не имеют ссылки на таблицу обычных методов (если структура имеет методы, она превращается в ссылочный тип с точки зрения представления в памяти, к виртуальным методам наследуемым от Object это не относится). Соответственно если для ссылочного типа указатель на экземпляр - это указатель на таблицу методов объекта, то указатель на тип значения - это указатель на само значение, или на первое значение если речь о структуре с несколькими полями. Перефразируя товарища Сталина - не важно как написано, важно во что скомпилировалось.
3
|
|
|
|
||||||||
| 11.02.2015, 14:03 | ||||||||
|
Но вот такой код компилируется и выполняется... Или я что-то не так понял?
0
|
||||||||
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|||
| 11.02.2015, 14:27 | |||
|
Во вложении иллюстрация размещения структур в памяти без методов и с методами. PS: Информация из книги "Оптимизация приложений на платформе .NET"
2
|
|||
|
|
|
| 11.02.2015, 14:35 | |
|
freeba, Эм...
Не таблица методов не предусмотрена, а указатель на таблицу методов не предусмотрен. Он и не нужен для структур. Сам указатель на таблицу методов внутри объекта нужен для динамического полиморфизма (...и ещё Б-г знает для чего). Так как структуры - тип закрытый для наследования, этот указатель не нужен. Единственное исключение, это даункастинг к Object и к интерфейсу, но тут в CLR есть замечательный костыль в виде boxing/unboxing. Для обращения к методу той же структуры, достаточно того, что компилятор знает тип структуры изначально (можете посмотреть IL код любого метода с инициализацией структуры), и соответственно найти нужный метод в метаданных. Прошу поправить меня, где я не прав.
2
|
|
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
||
| 11.02.2015, 14:55 | ||
|
0
|
||
|
|
||
| 11.02.2015, 15:03 | ||
|
freeba, я понял, что вы о boxing/unboxing, я просто воспринял ваше
1
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 11.02.2015, 15:14 | |||||
![]() Применительно к шарпу несоответствия нет. Тип используемой структуры известен статически, потому указатель на объект-тип, как в случае с классами, не нужен. Либо в книге ерунда написаны, либо вы что-то не так поняли.
2
|
|||||
|
Неадекват
1499 / 1236 / 247
Регистрация: 02.04.2010
Сообщений: 2,807
|
|
| 11.02.2015, 15:18 | |
|
Cupko, Выразился несколько некорректно. Подразумевал что при операции упаковки структура будет занимать в памяти столько же сколько и ссылочный объект.
А так если структура состоит из двух полей типа int - она всегда будет занимать 8 байт вне зависимости от реализации.
1
|
|
|
|
|||||||
| 11.02.2015, 15:29 | |||||||
![]()
0
|
|||||||
| 11.02.2015, 16:25 | |
|
0
|
|
|
Master of Orion
|
|
| 11.02.2015, 18:35 | |
|
kolorotur, я читал эту книгу и тоже удивился, потому что не помнил там ничего подобного. Книжка кстати очень хорошая, называется "что будет, если выжать всю воду из рихтера + пара полезных советов". Я например оттуда узнал про __makeref и прочие недокументированные фичи шарпа, что позволяет работать с указателем на структуру <T> (там был пример про преобразованию набора байт в структуру методами шарпа, очень любопытный).
0
|
|
| 11.02.2015, 18:35 | |
|
Помогаю со студенческими работами здесь
17
Выделение памяти Выделение неуправляемой памяти Выделение и освобождение памяти Выделение/освобождение памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|