как в IL работают call и callvirt?
От: help-me  
Дата: 05.07.13 16:13
Оценка: :)
Читаю я тут книгу рихтера (перевод, 3-е издание), и ничего не понимаю, зачем нужны 2 инструкции call и callvirt вызова методов вместо одной. Чтобы не поулчилось так, что читаю параграф совершенно зря, решил тут спросить, може кто-нить может нормально это объяснить?
И еще, в том же параграфе написано, что
public sealed class Program
{
public int GetFive(){return 5;}
public  static void Main(){Program p = null; int x = p.GetFive();}
}

такой код может нормально работать в CLR, если писать его не на сишарпе (типа, не задействована ссылка this, поэтому он может работать, но не в сишарпе, так как в сишарпе юзается для этого случая callvirt). Но, если, судя по книге рихтера, адрес вызова этого метода должен находиться в куче, а объект в куче не выделен, а значит не выделена память под метод GetFive(), а значит ссылкок ни на объект, ни на его метод нет? Как тогда он может работать?
Re: как в IL работают call и callvirt?
От: Kubyshev Andrey  
Дата: 05.07.13 17:54
Оценка:
HM>такой код может нормально работать в CLR, если писать его не на сишарпе (типа, не задействована ссылка this, поэтому он может работать, но не в сишарпе, так как в сишарпе юзается для этого случая callvirt). Но, если, судя по книге рихтера, адрес вызова этого метода должен находиться в куче, а объект в куче не выделен, а значит не выделена память под метод GetFive(), а значит ссылкок ни на объект, ни на его метод нет? Как тогда он может работать?

ТОчно также он будет работать и в C++
вот ответ.
http://stackoverflow.com/questions/193939/call-and-callvirt
В IL ассемблере callvirt имеет параметром номер из специальной таблицы в сборке. А в этой таблице черным по белому имя ф-ции текстом.
Re[2]: как в IL работают call и callvirt?
От: help-me  
Дата: 08.07.13 14:03
Оценка:
А нельзя просто иметь одну инструкцию (пусть будет callall) и параметром передавать туда адрем нужной функции (статической, базовой, переопределяющей, наследованной)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.