Я прочитал сообщение о 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]
Я правильно предполагая, что это динамическая отправка? Если да, есть ли другие контрольные признаки? Если я ошибаюсь, как я могу определить, является ли это динамической отправкой или нет?
Так выглядит шаблон для вызова смещения знака динамической отправки или это целая 4 группа команд, которая является признаком подсказки? – Jetti
@ Джетти: Я отредактировал ответ. Знак динамической отправки использует адрес объекта, чтобы вывести адрес функции, а затем использовать этот адрес функции для выполнения вызова. – sharptooth
большое спасибо. Я был на 80% уверен, что это было, но, учитывая мой недостаток опыта, я просто хотел быть уверенным. – Jetti