Would you like to react to this message? Create an account in a few clicks or log in to continue.



 
AnasayfaAnasayfa  Latest imagesLatest images  Kayıt OlKayıt Ol  Giriş yapGiriş yap  

 

 C# MSIL ve C++ CLR Karşılaştırması

Aşağa gitmek 
YazarMesaj
Apocalypse
Genelkurmay Başkanı
Genelkurmay Başkanı
Apocalypse


Erkek Mesaj Sayısı : 411
Yaş : 31
Nerden : Ms-Dos
Kayıt tarihi : 20/02/09

C# MSIL ve C++ CLR Karşılaştırması Empty
MesajKonu: C# MSIL ve C++ CLR Karşılaştırması   C# MSIL ve C++ CLR Karşılaştırması EmptyPaz Şub. 22, 2009 1:50 am

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
Sayfa başına dön Aşağa gitmek
 
C# MSIL ve C++ CLR Karşılaştırması
Sayfa başına dön 
1 sayfadaki 1 sayfası

Bu forumun müsaadesi var:Bu forumdaki mesajlara cevap veremezsiniz
 :: Programlama :: C#j#vb.net (.Net Dilleri)-
Buraya geçin:  
Copyright © Osmanlı Tim
Osmanlı Güvenlik || The Ottoman Security
Developed By CeMRe-eX || The Labrador
forum kurmak | ©phpBB | Bedava yardımlaşma forumu | Suistimalı göstermek | Son tartışmalar