![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Вопрос теоретического характера. Для примера рассмотрим тип int. Тип int является алиасом для класса System.Int32. Класс System.Int32 хранит 4-х байтовую переменную и набор методов. Так вот меня интересует, каким таким образом в памяти хранятся методы, что размер переменной типа int составляет 4 байта. Т. е. получается, что методы никак не отражаются на весе объекта класса.
|
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
так ведь Int32 - это структура, а не класс... -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
метод один и тот же для любого объекта, так что нет смысла хранить его для каждого память для него выделяется один раз, как и для любой другой функции а вызывается потом для разных объектов -------------------- qqq |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
maxim1000, ага
У структурных типов нельзя вызывать методы типа: myInt.ToString() Уже слышу как все кричат: можно, сам такое делал, чё за пурга, ... Дело в том, что в процесе вызова метода у структуры происходит неявный процесс упаковки (или распаковки) этой структуры "в класс" в переменную ссылочного типа, после чего вызывается метод из общей для всех экземпляров таблицы. А для того, чтобы мотод класса мог работать с конкретным экземпляром (чей метод мы вызываем) одним из параметром идет ссыка не распакованный/упакованный объект Возможно вопрос был в другом: "Как они так безалаберно хранят данные, что 2-хбайтовая переменная у них выросла в 4 байта?" Просто идет округление размеров любых типов до кратности 4-м (4, 8, 12, 16,...). Это сделано для облегчения работы сборщика мусора и менеджера стека (во как я его обозвал Даже 1-битовая переменная типа bool хранится в виде 4 байт |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
||||
|
||||
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Точно Try it
Добавлено @ 14:28
|
||||
|
|||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
I have tried it |
|||
|
||||
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Да.
Нормально все сделано. Кста я неправильно выразился. Типы занимают места ровно столько сколько им надо, но вот при хранении в стеке или куче они забиваются пустыми значениями до кратности 4-м байтам. А в чем проблемма? Жалко памяти? Переходи на более низкоуровневые языки. Под .Net даже пустое окно хавает 4Мб памяти (вроде столько, кто-то даже ругался на это) |
||||
|
|||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Забавно, забавно... Видимо, в этом действительно был смысл, и производительность улучшается на гораздо более значимые цифры, нежели засоряется память!
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Довод №1:
Данные и код хранятся отдельно. Int32 хранит только данные, ничего более, т.к. value types не подразумевают таблицу виртуальных методов (и наследования там кстати вообще нет). Как было в С++: если есть класс, то данные класса компилируются в структуру, имеющую детерминированный размер, а код (методы и т.п.) класса компилируется в отдельную пачку байтов, которая для слинкованного модуля загружается в сегмент кода и существует совершенно независимо от данных. У каждого экземпляра класса существует 1 пачка данных и общая пачка кода, если угодно. Довод №2: Память PC организована строго определённым образом. Таким образом, что вынимать из неё однобайтовые значения немного медленнее чем 4-байтовые. И намного медленнее, чем 1-страничные. По сути дела, чтение и запись на физическом уровне всегда происходят целыми страницами. Операционная система и ЦПУ заботятся о том, чтобы наиболее актуальные страницы (с которыми чаще всего работаем) всегда были в кэше L2 или L1. Компилятор старается позаботиться о том, чтобы данные были выровнены по границам 2^N, если не по 1024 то хотя бы по 4-м байтам. -------------------- ![]() |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Надо думать, на 64-битных машинах доступна быстрая адресация 8-байтовых значений. Так что, то ли ещё будет с бедным bool Это сообщение отредактировал(а) marcusmae - 27.1.2007, 00:05 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
А зачем тогда вообще нужен тип byte? bool наверно нужен для лучшего понимания кода, все таки true/false лучше чем 0/1. А byte зачем?
-------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
А ты им часто пользуешься? То-то. Нужен он для использовании в связке с другими технологиями. Например для получения правильной информации от WinAPI-шных функций. |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Думал над этим вопросом, и вспомнил, что чаще всего пользую byte при записи в файл. В файлы то данные записываются/читаются пока еще, слава богу, по байтам. Это сообщение отредактировал(а) Naum - 29.1.2007, 15:54 -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |