Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вес типов в C# 
:(
    Опции темы
Idsa
Дата 25.1.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Вопрос теоретического характера. Для примера рассмотрим тип int. Тип int является алиасом для класса System.Int32. Класс System.Int32 хранит 4-х байтовую переменную и набор методов. Так вот меня интересует, каким таким образом в памяти хранятся методы, что размер переменной типа int составляет 4 байта. Т. е. получается, что методы никак не отражаются на весе объекта класса.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
marcusmae
Дата 26.1.2007, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата

каким таким образом в памяти хранятся методы, что размер переменной типа int составляет 4 байта


так ведь Int32 - это структура, а не класс...


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
maxim1000
Дата 26.1.2007, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата(Idsa @  25.1.2007,  22:32 Найти цитируемый пост)
Так вот меня интересует, каким таким образом в памяти хранятся методы, что размер переменной типа int составляет 4 байта

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


--------------------
qqq
PM WWW   Вверх
ivashkanet
Дата 26.1.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



maxim1000, ага
Цитата(marcusmae @  26.1.2007,  00:41 Найти цитируемый пост)
так ведь Int32 - это структура, а не класс...

У структурных типов нельзя вызывать методы типа: myInt.ToString()
Уже слышу как все кричат: можно, сам такое делал, чё за пурга, ...
Дело в том, что в процесе вызова метода у структуры происходит неявный процесс упаковки (или распаковки) этой структуры "в класс" в переменную ссылочного типа, после чего вызывается метод из общей для всех экземпляров таблицы.
А для того, чтобы мотод класса мог работать с конкретным экземпляром (чей метод мы вызываем) одним из параметром идет ссыка не распакованный/упакованный объект smile
Цитата(Idsa @  25.1.2007,  22:32 Найти цитируемый пост)
что размер переменной типа int составляет 4 байта

Возможно вопрос был в другом:
"Как они так безалаберно хранят данные, что 2-хбайтовая переменная у них выросла в 4 байта?"

Просто идет округление размеров любых типов до кратности 4-м (4, 8, 12, 16,...). Это сделано для облегчения работы сборщика мусора и менеджера стека (во как я его обозвал smile )

Даже 1-битовая переменная типа bool хранится в виде 4 байт 

 smile 
PM MAIL WWW ICQ   Вверх
Idsa
Дата 26.1.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(ivashkanet @  26.1.2007,  08:48 Найти цитируемый пост)
Как они так безалаберно хранят данные, что 2-хбайтовая переменная у них выросла в 4 байта

С чего это? int - 4-х байтовая переменная!

Цитата(ivashkanet @  26.1.2007,  08:48 Найти цитируемый пост)
Даже 1-битовая переменная типа bool хранится в виде 4 байт

Точно? Что-то это уж слишком! Гон какой-то smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 26.1.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Idsa @  26.1.2007,  13:15 Найти цитируемый пост)
С чего это? int - 4-х байтовая переменная!

Точно smile Не так посчитал smile
Цитата(Idsa @  26.1.2007,  13:15 Найти цитируемый пост)
Точно? Что-то это уж слишком! Гон какой-то

Try it
Код

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(typeof(bool)));
            Console.ReadKey();
        }

    }


Добавлено @ 14:28 
Цитата(MSDN)

Although you can use the SizeOf method, the value returned by this method is not always the same as the value returned by sizeof. Marshal.SizeOf returns the size after the type has been marshaled whereas sizeof returns the size as it has been allocated by the Common Language Runtime, including any padding.

PM MAIL WWW ICQ   Вверх
Idsa
Дата 26.1.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(ivashkanet @  26.1.2007,  14:28 Найти цитируемый пост)
Try it

I have tried it  smile! Но я все-таки не пойму, в чем проблема, почему нельзя реализовать все красиво. Даже в Паскале такого бреда не было smile. Может, они сделали это с целью повышения производительности?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 26.1.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Idsa @  26.1.2007,  14:49 Найти цитируемый пост)
Может, они сделали это с целью повышения производительности?

Да. 
Цитата(ivashkanet @  26.1.2007,  07:48 Найти цитируемый пост)
Это сделано для облегчения работы сборщика мусора и менеджера стека (во как я его обозвал  )

Цитата(Idsa @  26.1.2007,  14:49 Найти цитируемый пост)
Но я все-таки не пойму, в чем проблема, почему нельзя реализовать все красиво. Даже в Паскале такого бреда не было

Нормально все сделано. Кста я неправильно выразился. 
Типы занимают места ровно столько сколько им надо, но вот при хранении в стеке или куче они забиваются пустыми значениями до кратности 4-м байтам.

А в чем проблемма? Жалко памяти? Переходи на более низкоуровневые языки.
Под .Net даже пустое окно хавает 4Мб памяти (вроде столько, кто-то даже ругался на это)

PM MAIL WWW ICQ   Вверх
Idsa
Дата 26.1.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Забавно, забавно... Видимо, в этом действительно был смысл, и производительность улучшается на гораздо более значимые цифры, нежели засоряется память!  smile 


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 26.1.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Довод №1:

Данные и код хранятся отдельно. Int32 хранит только данные, ничего более, т.к. value types не подразумевают таблицу виртуальных методов (и наследования там кстати вообще нет). Как было в С++: если есть класс, то данные класса компилируются в структуру, имеющую детерминированный размер, а код (методы и т.п.) класса компилируется в отдельную пачку байтов, которая для слинкованного модуля загружается в сегмент кода и существует совершенно независимо от данных. У каждого экземпляра класса существует 1 пачка данных и общая пачка кода, если угодно.

Довод №2:

Память PC организована строго определённым образом. Таким образом, что вынимать из неё однобайтовые значения немного медленнее чем 4-байтовые. И намного медленнее, чем 1-страничные. По сути дела, чтение и запись на физическом уровне всегда происходят целыми страницами. Операционная система и ЦПУ заботятся о том, чтобы наиболее актуальные страницы (с которыми чаще всего работаем) всегда были в кэше L2 или L1. Компилятор старается позаботиться о том, чтобы данные были выровнены по границам 2^N, если не по 1024 то хотя бы по 4-м байтам.


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 27.1.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата

Память PC организована строго определённым образом. Таким образом, что вынимать из неё однобайтовые значения немного медленнее чем 4-байтовые.


Надо думать, на 64-битных машинах доступна быстрая адресация 8-байтовых значений. Так что, то ли ещё будет с бедным bool smile 

Это сообщение отредактировал(а) marcusmae - 27.1.2007, 00:05


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Naum
Дата 29.1.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



А зачем тогда вообще нужен тип byte? bool наверно нужен для лучшего понимания кода, все таки true/false лучше чем 0/1. А byte зачем?


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
ivashkanet
Дата 29.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Naum @  29.1.2007,  13:53 Найти цитируемый пост)
А byte зачем?

А ты им часто пользуешься?
То-то.
Нужен он для использовании в связке с другими технологиями.
Например для получения правильной информации от WinAPI-шных функций.
PM MAIL WWW ICQ   Вверх
Naum
Дата 29.1.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(ivashkanet @  29.1.2007,  16:01 Найти цитируемый пост)
А ты им часто пользуешься?

Думал над этим вопросом, и вспомнил, что чаще всего пользую byte при записи в файл. В файлы то данные записываются/читаются пока еще, слава богу, по байтам.  smile 


Это сообщение отредактировал(а) Naum - 29.1.2007, 15:54


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.