![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| nmn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
Код из C# via .NET Рихтер
Вопрос: почему происходит упаковка в 9 строчке? Почему без нее нельзя? |
||||
|
|||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nmn, Код System.Object ожидает this указывающий на объект в куче, и для вызова нужна упакованная структура.
Метод Point.ToString точно знает что он работает над куском стека. Кроме того, компилятор знает что у Point нет наследников, читерит - заменяет callvirt на constrained. Point callvirt. Т.е. фактически тут не вызов виртуального метода, а простой вызов метода структуры, причем и вызывающая и вызываемая сторона знают что работают со структурой, а не с reference type - поэтому общаются без упаковки. |
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
а в ToString разве никакого указателя на экземпляр Point не передается? откуда ToString знает для какого экземпляра ее вызвали?
|
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
получается что если
то для вызова ToString необходимо упаковать c? |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nmn, для вызова c.ToString - нет, тут прямой вызов (constrained callvirt). Для вызова base.ToString - да, нужна упаковка. Посмотри сам ildasm-ом или рефлектором на код Test.ToString:
|
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
ладно с боксингом вроде бы понятно: упаковка происходит при вызове методов, не реализуемых данным типом?
а вот каким образом ToString получает доступ к локальным переменным типа при отсутствии упаковки? |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nmn
ldarg.0 в и случае структуры, и в случае reference type загружает в стек адрес объекта. В документации сказано что value type копируется, но отладчик показывает обратное. Ну и дальше идет обычная работа через ldfld/stfld. Все дело в том, что компилятор и jit точно знают тип объекта, на который указывает this (arg 0), и могут в любой момент определить, надо ли боксить, или можно работать с ним напрямую. |
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
можно меня ссылкой осчастливить на описание il инструкций?
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
||||
|
||||
| nmn |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
Почему не происходит упаковка o? ведь o может быть значимым типом вот тут происходит:
Это сообщение отредактировал(а) nmn - 8.12.2008, 03:04 |
||||||||
|
|||||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nmn, потому что на самом деле упаковка происходит. Почитай хелп по constrained - в примере с ToString он не упаковавал, а тут - неявно упаковывает.
Вообще, boxing - внутренний механихм .net, который работает относительно прозрачно для разработчика. Про него вообще нужно вспоминать только если черезмерное его использование вызывает проблемы с производительностью. А время на упаковку одного объекта - 0.000 секунд. |
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
http://msdn.microsoft.com/en-us/library/sy...onstrained.aspx т.е работает вот это?
Это сообщение отредактировал(а) nmn - 8.12.2008, 16:58 |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
nmn, да. на практике это значит что до jit-компиляции неизвесно будет boxing или нет.
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |