C# MSIL ve C++ CLR Karşılaştırması
--------------------------------------------------------------------------------
C# Kodlarının MSIL a ve C++ Kodlarının CLR a Çevrilmesinin Karşılaştırması
Yazımızın bu bölümünde C++/CLI compiler’ın oluşturduklarlını ve
C# compiler’ın oluşturduklarını dikkatlice inceleyeceğiz...
Fakat şuanda herhangi bir MSIL uygulaması yapmayı istemeyiz daha çok MSIL’ı analiz edeceğiz...
C++/CLI incelemesi:
C++/CLI ı gerçekten çok severim,bu çift dünyanın kuşkusuz en iyisidir - geliştiriciye programcılık dünyasının
içine ve dışına kusursuzca atlaması için izin verirler.C++/CLL (Ve C)ile ilgili uygulama geliştirme sistemi ve,
C# veya VB.NET uzayından daha çok adapte edilmiş sistemlere dikkat çekmek istiyorum.
Not:C++’ın gelecek versiyonu normalden dönüştürülmüş bir çöp toplayıcısı(Garbage Collector) içerecek.
[html][Person.h]
#pragma once
ref class Person
{
public:
Person(****);
Person(System::String^ firstName, System::String^ lastName);
System::String^ GetFirstName(****);
**** SetFirstName(System::String^ firstName);
System::String^ GetLastName(****);
**** SetLastName(System::String^ lastName);
virtual System::String^ ToString(****) override;
private:
System::String^ m_firstName;
System::String^ m_lastName;
};
[/Person.h]
[Person.cpp]
#include "StdAfx.h"
#include "Person.h"
using namespace System;
Person::Person(****)
{
m_firstName = System::String::Empty;
m_lastName = System::String::Empty;
}
Person::Person(System::String^ firstName, System::String^ lastName)
{
m_firstName = firstName;
m_lastName = lastName;
}
System::String^ Person::GetFirstName(****)
{
return m_firstName;
}
**** Person::SetFirstName(System::String^ firstName)
{
m_firstName = firstName;
}
System::String^ Person::GetLastName(****)
{
return m_lastName;
}
**** Person::SetLastName(System::String^ lastName)
{
m_lastName = lastName;
}
System::String^ Person::ToString(****)
{
return m_firstName + " " + m_lastName;
}
[/Person.cpp]
Şimdi benzer bir Person Classını C# da bir kaç metodla MSIL da oluşturacağız.
[C# KODU]
using System;
namespace MsilTest
{
public class Person
{
private string _firstName;
private string _lastName;
public Person(string firstName, string lastName)
{
_firstName = firstName;
_lastName = lastName;
}
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public override string ToString()
{
return _firstName + " " + _lastName;
}
}
}
[/C# KODU]
Karşılaştırma
Şimdi ise MSIL da oluşturulmuş ilk ToString() metoda bakın:
[C++/CLI KODU]
.method public hidebysig virtual instance string
ToString() cil managed
{
// Code size 30 (0x1e)
.maxstack 2
.locals ([0] string V_0)
IL_0000: ldarg.0
IL_0001: ldfld string Person::m_firstName
IL_0006: ldstr " "
IL_000b: call string [mscorlib]System.String::Concat(string,
string)
IL_0010: ldarg.0
IL_0011: ldfld string Person::m_lastName
IL_0016: call string [mscorlib]System.String::Concat(string,
string)
IL_001b: stloc.0
IL_001c: ldloc.0
IL_001d: ret
} // end of method Person::ToString
[/C++/CLI KODU]
[C# KODU]
.method public hidebysig virtual instance string
ToString() cil managed
{
// Code size 28 (0x1c)
.maxstack 3
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld string MsilTest.Person::_firstName
IL_0007: ldstr " "
IL_000c: ldarg.0
IL_000d: ldfld string MsilTest.Person::_lastName
IL_0012: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0017: stloc.0
IL_0018: br.s IL_001a
IL_001a: ldloc.0
IL_001b: ret
} // end of method Person::ToString
[/C# KODU]
[/html]Burada da gördüğünüz gibi C++/CLI ve C# arasında aşırı bir fark yok.
C# compiler,CLR a bellekte 3 Slot istediğini söylüyor çünkü onu herhangi 3 args alacak.Böylece 3 string
belleğe planlanmış metod çağrısı yapıyor.Ardıncan C++/CLI 2 defa metodla bağlantı kuruyor bundan dolayı
maxiumum bellek sayısı 2 oluyor.
Not:Her iki Binaryde debug releasedır ve uyarlanmamıştır