2012-04-03 1 views
4

Я прочитал сообщение о Reddit на Herb Stutter: JIT will never be as fast as native, и кто-то сделал комментарий, что было невероятно, что кто-то назвал Herb «дезинформированным», что C# использует виртуальные методы вместо не виртуальных (вы можете прочитать статью here). Это заставило меня задуматься, и я сделал небольшую небольшую программу и заметил, что C# фактически генерирует виртуальные методы для CIL (callvirt vs call). Но потом мне сказали, что это не так просто и что JIT может встроить код вместо использования vtables и динамической отправки. Я запустил мой отладчик и попытался посмотреть. Вот моя простая программа:Как узнать, использует ли программа динамическую отправку, глядя на сборку

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test t = new Test(); 
      t.TestIt(); 
      t.TestOut(); 

     } 
    } 

    class Test 
    { 
     public Test() { } 
     public void TestIt() 
     { 
      Console.WriteLine("TESTIT"); 
     } 
     public void TestOut() 
     { 
      Console.WriteLine("TESTOUT"); 
     } 
    } 
} 

А потом вот сборка:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test t = new Test(); 
00000000 push  ebp 
00000001 mov   ebp,esp 
00000003 push  esi 
00000004 mov   ecx,439E68h 
00000009 call  FFCE0AD4 
0000000e mov   esi,eax 
      t.TestIt(); 
00000010 call  704BBEB8 // Call to Console.WriteLine() 
00000015 mov   ecx,eax 
00000017 mov   edx,dword ptr ds:[02A02088h] 
0000001d mov   eax,dword ptr [ecx] 
0000001f call  dword ptr [eax+000000D8h] 
      t.TestOut(); 
00000025 call  704BBEB8 // Call to Console.WriteLine() 
0000002a mov   ecx,eax 
0000002c mov   edx,dword ptr ds:[02A0208Ch] 
00000032 mov   eax,dword ptr [ecx] 
00000034 call  dword ptr [eax+000000D8h] 
0000003a pop   esi 

    } 
0000003b pop   ebp 
0000003c ret  

Мой вопрос заключается в следующем: глядя на сборку как можно сказать, если он использует динамическую отправку? Я подозреваю, что это из-за этих 4-х команд, которые напоминают то, что я помню из моего класса языков программирования:

0000002a mov   ecx,eax 
0000002c mov   edx,dword ptr ds:[02A0208Ch] 
00000032 mov   eax,dword ptr [ecx] 
00000034 call  dword ptr [eax+000000D8h] 

Я правильно предполагая, что это динамическая отправка? Если да, есть ли другие контрольные признаки? Если я ошибаюсь, как я могу определить, является ли это динамической отправкой или нет?

ответ

2

Да, эта модель, которая смотрит на виртуальные таблицы, как вещь, а затем использует извлеченный адрес для выполнения вызова функции

00000032 mov   eax,dword ptr [ecx] 
00000034 call  dword ptr [eax+000000D8h] 

Является признаком динамической диспетчеризации (также называется динамическое связывание). Шаблон в основном делает следующее: используя адрес объекта, он выводит тип объекта (он фактически просто находит указатель vtable, хранящийся внутри объекта) и находит, какую функцию вызывать (зная его индекс в таблице vtable). Альтернативный вариант, если вы уже знаете фактический тип объекта, - это просто вызвать правильную функцию напрямую.

Например, в C++:

class Class { 
public: 
    virtual void Method() {} 
}; 

Class* object = new Object(); 
object->Method(); 
delete object; 

Здесь компилятор достаточно данных, чтобы знать, что object хранит адрес объекта типа class Class, поэтому он не может просто испускать прямой (не виртуальные таблицы поиска в) звоните в Class::Method() что, конечно, быстрее.

+0

Так выглядит шаблон для вызова смещения знака динамической отправки или это целая 4 группа команд, которая является признаком подсказки? – Jetti

+0

@ Джетти: Я отредактировал ответ. Знак динамической отправки использует адрес объекта, чтобы вывести адрес функции, а затем использовать этот адрес функции для выполнения вызова. – sharptooth

+0

большое спасибо. Я был на 80% уверен, что это было, но, учитывая мой недостаток опыта, я просто хотел быть уверенным. – Jetti

3

Косвенный вызов, например. call dword ptr [eax+000000D8h] является признаком использования виртуальной таблицы

 Смежные вопросы

  • Нет связанных вопросов^_^