Re: Узнать, упакована ли переменная | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Принцип Питера в действии:
"В иерархической системе каждый поднимается до уровня своей некомпетентности. Со временем все должности займут некомпетентные сотрудники". |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Ответ - операции упаковки не будет. Т.е. нехрен использовать структуры, которые потом надо упаковывать - сразу надо использовать классы. |
Re: Узнать, упакована ли переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Когда выбирают что сделать - структуру или класс, то думают прежде всего о логической стороне дела - будет это "значение" (пускай и хитрое, состоящее из нескольких компонент), или это будет "объект" который изменяется, реагирует на внешние сигналы...
struct вообще достаточно нечасто применяется. Как раз по причине того что это "значение", а в большинстве случаев в их качестве выступают встроенные типы - те же int, string... Структуру по-хорошему нельзя изменять после создания/начального заполнения. Т.е. её можно заменить "полностью" - ну как число, было 1234 стало 5678. А не "частично", типа вторую цифру заменить с 2 на 9 - это как раз нарушает "смысл" числа - если тебе нужно такое, то вероятно тебе нужно было сразу НЕ число (как что-то единое), а "набор цифр" P.S. Это я к тому что про упаковки/распаковки в это время вообще не думают. Про них можно вспомнить при оптимизации кода, а не во время проектирования классов... P.P.S. Ну вопросы на собеседовании в принципе не могут быть "умными". Что можно спросить то у претендента, кроме какой-то из страниц "азбуки". Попросить написать программу? Это уже НЕ собеседование. Рассказать как он крут и чем занимался - можно, но это обычно есть в резюме, зачем повторяться... ------------------ WBR, Igor Исправлено 2 раз(а). Последнее : Igor Korolyov, 15.04.17 19:03 |
Re: Узнать, упакована ли переменная | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Ну, степень лояльности к работодателю можно узнать без проблем во время собеседования. С компетентностью, конечно, посложнее будет.
|
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Это точно. Честно говоря, сомневаюсь, что упаковка/распаковка может сильно повлиять на производительность. |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Почитал на разных сайтах определение и родил: Преобразование значения переменной значимого типа в значение переменной ссылочного типа сопровождается неявной операцией упаковки (boxing) — помещение копии значения из значимого типа в класс-обёртку (экземпляр которого сохраняется в куче). Тип класса-обёртки (используемого для упаковки) генерируется CLR и реализует интерфейсы сохраняемого значимого типа. Преобразование значения переменной ссылочного типа в значение переменной значимого типа вызывает операцию распаковки (unboxing) — извлечение из класса-обёртки значения и помещения копии значения в переменную (располагающуюся в стеке) значимого типа. Так всё корректно? |
Re: Узнать, упакована ли переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, вроде как корректно...
Во многих случаях влияет - не зазря же придумали generic-и. Одной из основных целей как раз и было дать возможность использовать коллекции структур БЕЗ операций упаковки/распаковки оных (для reference типов тоже есть свои плюсы в типизированной коллекции) - как происходит в не-generic ArrayList и им подобных. Вторая основная цель - добавление typesafety, т.е. контроля типов коллекциям. ------------------ WBR, Igor |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В "CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#. 4-е изд. (2013)" сказано (подчёркнуто мной):
С одной стороны, явно про класс-обёртку не упомянуто. С другой стороны, из написанного видно, что в этом классе есть поле, указывающее на тип переменной значимого типа. Фраза про "опасность «распухания» кода" - наверное, имеется ввиду IL-код. Исправлено 2 раз(а). Последнее : S-type, 16.04.17 13:40 |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Мне казалось, что обобщения придуманы для "повторного использования" кода... Как-то даже и не задумывался, что обобщённая коллекция будет приводить к уменьшению количества упаковок. Хотя, если задуматься - так оно и есть. |
Re: Узнать, упакована ли переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Что есть класс-обёртка в твоей терминологии? Внутренне, на самом примитивном уровне, любой экземпляр (т.е. объект) ссылочного типа в памяти (в куче) хранится именно в таком виде - dword с номером синхроблока, потом dword указатель на type, потом собственно "поля" этого объекта. При том адресуется экземпляр чуть хитрее - адресом 2-го поля, т.е. "указателя на тип", а первое поле получается как указатель_на_объект-4 (это если ты будешь в отладчике в memory окне смотреть на хранение объектов в памяти, и получать "адрес объекта" через &переменная). Соответственно если прописать в блоке памяти в куче эти 2 служебных поля и потом поместить собственно "значимые поля из value type", то мы и получим по сути экземпляр ссылочного типа - вероятно его можно назвать объектом-обёрткой (классом называть экземпляр некорректно). Вот то куда указывает 2-е поле - это указатель на класс (или тип - это слова-синонимы). Только я не уверен что существует два разных "класса" для того же Int32 - один для использования с "обычными значениями на стеке", и другой для "упакованных" значений в куче... Нет, это поле указывает на СОБСТВЕННО "тип". Не на переменную, не на экземпляр. Если грубо - это указатель на System.Type, связанный с данным объектом. Олег как раз задавал вопрос "неужели с каждым значением система хранит и его тип" - так вот для reference типов это так и есть. И для упакованных value типов тоже. Для неупакованных - только у компилятора есть информация о типе, которой он и пользуется при генерации кода. В рантайме уже нет никакой "ссылки на тип" - но она, естественно, появится при "упаковке" (т.к. сама инструкция box требует не только "значения" но и "типа" в качестве "параметров"). Кстати, забавный нюанс - в некоторых случаях C# компилятор вставляет инструкцию box даже для reference типов (в generic классах где параметр типа "ограничен" ссылочными типами) - при jit-компиляции таких box-инги просто игнорируются. Т.е. далеко не всякий встретившийся в IL box будет на самом деле исполнен процессором Это всё слишком общие слова. "Повторно использовать код" можно вполне себе и без generic-ов. В версиях до 1.1 только так и можно было работать, и ничего - работали же Из мануала: Цитата:Т.е. основная цель - это устранение потенциального "несоответствия типов" в рантайме (т.к. без generic придётся использовать именно object в качестве типа - а значит в тот же ArrayList можно напихать и строки и числа и Customer-ов и Product-ы, и потом бодро падать при попытке преобразовать элемент списка обратно к "логически требуемому" типу - например к Customer) ну и "упаковки" для значных типов - это уже вопрос производительности и использования памяти. Конечно же и в "старом" фреймворке можно было обеспечить типобезопасность коллекции - НО это потребовало бы создания своего класса-наследника, в котором и "проверялись" бы типы при работе с коллекцией - сам же интерфейс был бы типобезопасным - но не "стандартным" IList, а, скажем IListString. И вот тут то как раз попытка "сделать правильно" и приводила бы к многократному дублированию кода - т.к. в ArrayListString нельзя помещать числа, а в ArrayListInt нельзя помещать даты ну и т.д. Т.е. избыточность в данном случае возникает на сама по себе, а лишь от попыток написать типобезопасный код. Если забить на всё и оперировать штатным ArrayList, просто ловя периодически InvalidCastException, то избыточности никакой не возникнет. Возникнет лишь "проблема фокса" с мешаниной типов ------------------ WBR, Igor |
Re: Узнать, упакована ли переменная | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Дурацкий вопрос, если можно:int val = 5;
int val = 5; object o = val; // упаковка становится видна "переменная" под именем o: - и занимается память под значение val?, значение-то и его тип компилятор знает, - пакует (что это за преобразование? символьную строку - "зазипует" что ли?) - int j = (int)o - значит тип запакованного теряется при паковке. надо знать его заранее, тобы паспаковать? |
Re: Узнать, упакована ли переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, создаётся переменная o, способная содержать в себе ссылку на что угодно (т.к. тип переменной это object - базовый для любых объектов в среде дотнета). Для переменной val в момент её создания выделяется память в стеке, туда записывается "просто значение 5". Упаковка, это создание объекта-обёртки для типа int. Объект такого типа (как и любого другого "значного" типа) может быть представлен в 2-х видах - в неупакованном - в стеке или внутри других сложных объектов (если у них есть поля соответствующего типа), и в "упакованном" - обычно в "куче". Грубо говоря, это хранение соответствующего значения "с заголовками" - такими же как у любых других объектов среды. По сути упаковка это выделение памяти, установление значений в "служебных" полях (счётчик блокировок и указатель на тип) и копирование данных в собственно поля с данными (которые находятся сразу же за 2-мя служебными полями). Тип данных как раз не теряется при упаковке - напротив, он "появляется" в явном виде - как поле в соответствующей структуре в памяти. Вот для "неупакованных" значений тип явно не хранится - его знает компилятор и соответствующим образом генерирует код. ------------------ WBR, Igor |
Re: Узнать, упакована ли переменная | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
("Стек" - наверное, в данном ответе - это "свалка памяти". "Стек" - слово заставляет контролировать, что мол, если втолкнули туда, та надо и в том же порядке и извлечь)
счётчик блокировок и указатель на тип - еще 2 понятия... Это что за звери... Такое только в фоксе возможно... Да... Шарп - не мое) Исправлено 1 раз(а). Последнее : of63, 16.04.17 23:37 |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В общем то, на авторсто термина не претендую - подсмотрел на каком то сайте. Но, термин мне понравился, как отражающи суть. Поясню. На сколько понимаю, ссылка должна быть на объект, а объект - это экземпляр какого то класса. Класс нужен для операции "упаковка", причём под упаковкой понимается не сжатие (как во фразе "файл упакован утилитой ZIP"), а "помещение куда то внутрь" (как во фразе "турист упаковал снаряжение" или "в магазине тщательно упаковали покупку"). В принципе, можно было написать просто "класс", или даже просто "упаковка". Но, мне кажется, "класс-обёртка" всё таки понятнее, чем "класс-упаковка". Мне кажется, это уже слишком глубоко... Вряд ли эти значния могут пригодиться при написании программы на C#. Или, ты хочешь сказать, что определение, данное Рихтером, совпадает с определением самого обычного объекта? Опять мозг взорван Да, CLR создаёт в памяти объект. Но разьве объект это (по определению) не экземпляр класса? Разьве может быть "просто" объект? Собственно, это же и написал... Можно написать так: > в этом классе есть поле, указывающее на тип (переменной значимого типа). Или так: > в этом классе есть поле, ссылающееся на тип (который был у переменной значимого типа). Не могу не согласиться. Мы живём в постФокс-овском мире... |
Re: Узнать, упакована ли переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Оно то да, только я сильно не уверен что это ОТДЕЛЬНЫЙ класс. Т.е. что Int32 и "упакованный в виде экземпляра Int32" это два разных класса. И потому сомневаюсь что корректно применять термин класс-обёртка. Вот хранятся они по разному - упакованный и неупакованный int. А что класс у них один (но в первом случае он "явно" не привязан к значению, хотя для вызовов методов наверняка используется) - это скорее всего так и есть. Да, упакованный value-тип это "самый обычный объект". Не понял вопроса... Объект это экземпляр (instance) определённого класса (тип более общее понятие нежели класс). В документации иногда и конкретные значения value-типов называют instance, но мне кажется это не совсем точно и приводит к путанице. Тут слово "переменная" лишнее - оно не существенно. Значение value-типа ("экземпляр", если уж нарушать терминологию) может существовать и без переменной - например как поле в другом типе, или как элемент в массиве... ------------------ WBR, Igor |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Если так подумать... Если для упакованного Int32 в поле "ссылка на тип" хранится ссылка на "Int32", значит это ссылочная переменная с типом "Int32" Это напоминает JavaScript. На некоторых сайтах по JavaScript упоминаются "классы-оболочки примитивных типов". Может, будет корректно говорить не обёртка, а оболочка? Хотя, по англицки "wrapper" - "обертка, упаковка"...
Вот, новая формулировка с учётом замечаний: Преобразование значения переменной значимого типа в значение переменной ссылочного типа сопровождается неявной операцией упаковки (boxing) — помещение копии значения из значимого типа в объект-обёртку (который сохраняется в куче). Преобразование значения переменной ссылочного типа в значение переменной значимого типа вызывает операцию распаковки (unboxing) — извлечение из объекта-обёртки значения и помещения копии значения в переменную (которая располагается в стеке) значимого типа. Теперь то точно придраться (в хорошем смысле этого слова) не к чему? |
Re: Узнать, упакована ли переменная | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Ну, ежели ТС непременно настаивает на "придирании", то по правилам следует писать "Теперь-то", то бишь через дефис. |
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
По поводу русского. Вчера сын пришёл с пробника по русскому, жаловался - что дают всякие ненужные слова. И тут я узнал, что всю жизнь говорил неправильно - надо говорить жерлО. Т.е. правильно будет "жерлО вулкана". Какя жуть... Давно уже говорю всем - надо каждые 100 лет приводить письменный язык в соответсвие с разговорным. А то соЛнце, леГко - какое то говнище... |
Re: Узнать, упакована ли переменная | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Орфоэпический словарь сообщает, что жЕрло - устаревшая форма ударения. Стало быть, во времена Пушкина таки было жЕрло.
|
Re: Узнать, упакована ли переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
На ebooks.grsu.by сказано:
Цитата: Язык постоянно меняется. То, что слова меняют ударение - абсолютно не критично для смысла. |
© 2000-2024 Fox Club  |