powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по method table
17 сообщений из 17, страница 1 из 1
Вопрос по method table
    #39135705
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день

Подскажите пожалуйста, зачем в method table конкретного типа добавляются его собственные невиртуальные методы.
Залип на данном вопросе.

Заранее спасибо
...
Рейтинг: 0 / 0
Вопрос по method table
    #39135906
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рискну предположить, что почти всегда для не виртуальных методов используется инструкция
callvirt.
Код: c#
1.
2.
3.
            Object o = null;
            var t1 = o.GetType();
            var t2 = new object().GetType();


Компилируется в
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IL_0000: nop
	IL_0001: ldnull
	IL_0002: stloc.0
	IL_0003: ldloc.0
	IL_0004: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
	IL_0009: stloc.1
	IL_000a: newobj instance void [mscorlib]System.Object::.ctor()
	IL_000f: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
	IL_0014: stloc.2
	IL_0015: call string [mscorlib]System.Console::ReadLine()
	IL_001a: pop
	IL_001b: ret


То есть, когда компилятор не уверен, что объект не null, он генерит callvirt instance и call instance в остальных случаях.

P.S.
Обнаружил из вышеописанного во чего.
Если
Код: c#
1.
2.
3.
4.
 if (o != null)
            {
                var t4 = o.GetType();
            }


То все равно callvirt instance.
А если
Код: c#
1.
var t3 = o?.GetType();


То call instance!
...
Рейтинг: 0 / 0
Вопрос по method table
    #39135980
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда возникает такой вопрос: а если метод наследуемый? его в таблице данного типа не будет. Как тогда?
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136012
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет в таблице предка.
Хотя я не силен в механизме vtable в .NET.
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136017
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в com таблица единая.
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136092
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вопрос остался.....
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136403
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут Эрик пытается объяснить про vtable в c#.
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136439
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, хорошая статья, но не то :(

Я Пытаюсь понять зачем в таблицу методов засунуты методы конкретного класса, типа.
скорее всего придется довольствоваться ответом потому что.

Спасибо за помощь, может что то еще найдется.....
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136514
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
это сишник Вас мучал?
наверное имхо методы интерфейса туда добавятся аки это нативный виртуал, ну и перекрытые не запечатаны методы
call and callvirt - это из другого места..
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136557
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136608
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

наверное сишник :)
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136610
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

не читал, спасибо
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136622
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже ЕвгенийВ прав в своих предположениях ......
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136731
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиcall and callvirt - это из другого места..
В чем их отличия?
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136745
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
последний год пишем на джаве, так что уже забывается ((
call для экземплярных методов идет проверка фантома this на null, в callvirt нету.
попробуй так
var t=new MyClass();

t.Foo(); - call

new MyClass().Foo callvirt
хотя одна и та-же функция
теперь лови момент - если вызываем виртуальную, мы обращаемся к объекту, получить указатель на таблицу функций
и вызываем ее, нах.. тут проверка на нуль? если объект по нулям нас на моменте обращения нах.. пошлют
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136768
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степипопробуй так
var t=new MyClass();

t.Foo(); - call

new MyClass().Foo callvirt
С точностью до наоборот:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace test
{
  class Program
  {
    static void Main(string[] args)
    {
      var f = new Foo();
      f.Bar();
      new Foo().Bar();
      //Console.WriteLine("done");
      //Console.ReadKey(true);
    }
  }
  public class Foo
  {
    public void Bar() { }
  }
}

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       23 (0x17)
  .maxstack  1
  .locals init ([0] class test.Foo f)
  IL_0000:  newobj     instance void test.Foo::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  callvirt   instance void test.Foo::Bar()
  IL_000c:  newobj     instance void test.Foo::.ctor()
  IL_0011:  call       instance void test.Foo::Bar()
  IL_0016:  ret
} // end of method Program::Main
...
Рейтинг: 0 / 0
Вопрос по method table
    #39136769
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
ну может быть )) студии на работе нету )
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по method table
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]