Hirdetés

Keresés

Új hozzászólás Aktív témák

  • sztanozs

    veterán

    válasz pmonitor #19935 üzenetére

    Ez csak annyit bizonyit, hogy az int (vagy struct altalanossagban) az object, nem pedig Sytem.Object leszarmazott, ami egyebkent nyilvanvalo a dokumentaciobol is...
    Mi is a problema? Az, hogy a GC nem foglalkozzik a stack-en levo valtozokkal?

  • pmonitor

    aktív tag

    válasz pmonitor #19935 üzenetére

    Röviden:
    A struct gyakorlatilag azt jelenti, hogy a változót "HELYBEN" hozza létre.
    A class azt jelenti, hogy a változót mindig a heap egy szabad területén hozza létre.

    Van ez a C# kód:
    namespace IntOseEAzObject
    {
    public class Program
    {
    static void Main(string[] args)
    {
    int[] lngt = { 10, 20, 30 };
    Struktura strct = new Struktura(10, 20, 30, lngt);

    long lng = strct.lng;
    int lng_2 = strct.lng_2;
    int lng_3 = strct.lng_3;
    int lng_4 = lngt[0];
    int lng_5 = lngt[1];
    int lng_6 = lngt[2];
    Console.WriteLine("{0} {1} {2} {3} {4} {5}", lng, lng_2, lng_3, lng_4, lng_5, lng_6);
    }
    }

    struct Struktura
    {
    public int lng;
    public int lng_2;
    public int lng_3;
    public int[] list;

    public Struktura(int lng, int lng_2, int lng_3, int[] list)
    {
    this.lng = lng;
    this.lng_2 = lng_2;
    this.lng_3 = lng_3;
    this.list = list;
    }


    }
    }

    Ez assemblyben így mutatkozik meg(csak a releváns részt másolom be ide:
    int[] lngt = { 10, 20, 30 };
    011508A5 mov ecx,63F6639Eh
    011508AA mov edx,3
    011508AF call CORINFO_HELP_NEWARR_1_VC (0107322Ch)
    011508B4 mov dword ptr [ebp-70h],eax
    011508B7 mov ecx,1084EF4h
    011508BC call 65485DE0 ;ez a metódus adja vissza az eax-ban az lngt[] címét.
    011508C1 mov dword ptr [ebp-74h],eax
    011508C4 lea eax,[ebp-74h]
    011508C7 push dword ptr [eax]
    011508C9 mov ecx,dword ptr [ebp-70h]
    011508CC call 65485A80
    011508D1 mov eax,dword ptr [ebp-70h]
    011508D4 mov dword ptr [ebp-40h],eax
    Struktura strct = new Struktura(10, 20, 30, lngt);
    011508D7 push 14h
    011508D9 push 1Eh
    011508DB push dword ptr [ebp-40h]
    011508DE lea ecx,[ebp-50h]
    011508E1 mov edx,0Ah
    011508E6 call IntOseEAzObject.Struktura..ctor(Int32, Int32, Int32, Int32[]) (01150450h)

    long lng = strct.lng;
    011508EB lea eax,[ebp-50h]
    011508EE mov eax,dword ptr [eax+4] ;Itt mindig az ebp-hez viszonyított helyzethez határozza meg. strct[0] esetén ebp+4
    011508F1 cdq
    011508F2 mov dword ptr [ebp-58h],eax
    011508F5 mov dword ptr [ebp-54h],edx
    int lng_2 = strct.lng_2;
    011508F8 lea eax,[ebp-50h]
    011508FB mov eax,dword ptr [eax+8] ;strct[1] esetén ebp+8
    011508FE mov dword ptr [ebp-5Ch],eax
    int lng_3 = strct.lng_3;
    01150901 lea eax,[ebp-50h]
    01150904 mov eax,dword ptr [eax+0Ch] ;strct[3] esetén ebp+12
    01150907 mov dword ptr [ebp-60h],eax
    int lng_4 = lngt[0];
    0115090A mov eax,dword ptr [ebp-40h]
    0115090D cmp dword ptr [eax+4],0
    01150911 ja IntOseEAzObject.Program.Main(System.String[])+0D0h (01150918h)
    01150913 call 656EFE40 ;referencia típus esetén(lngt[0]) mindig ezt a metódust hívja meg, ami az eax-ban adja vissza a referencia címét, ami a heap-ben van. Előtte nem véletleül ellenőrzi le, hogy érvényes-e a cím.
    01150918 mov eax,dword ptr [eax+8]
    0115091B mov dword ptr [ebp-64h],eax
    int lng_5 = lngt[1];
    0115091E mov eax,dword ptr [ebp-40h]
    01150921 cmp dword ptr [eax+4],1
    01150925 ja IntOseEAzObject.Program.Main(System.String[])+0E4h (0115092Ch)
    01150927 call 656EFE40 ;lngt[1] esetén is ugyanazt a metódust hívja meg.
    0115092C mov eax,dword ptr [eax+0Ch]
    0115092F mov dword ptr [ebp-68h],eax
    int lng_6 = lngt[2];
    01150932 mov eax,dword ptr [ebp-40h]
    01150935 cmp dword ptr [eax+4],2
    01150939 ja IntOseEAzObject.Program.Main(System.String[])+0F8h (01150940h)
    0115093B call 656EFE40 ;lngt2 esetén is ugyanazt a metódust hívja meg.
    01150940 mov eax,dword ptr [eax+10h]
    01150943 mov dword ptr [ebp-6Ch],eax
    Console.WriteLine("{0} {1} {2} {3} {4} {5}", lng, lng_2, lng_3, lng_4, lng_5, lng_6);
    01150946 mov eax,dword ptr ds:[483244Ch]
    0115094C mov dword ptr [ebp-78h],eax
    0115094F mov ecx,63F664BAh
    01150954 mov edx,6

    A kódba magyarázatot is tettem. Érdemes elgondolkodni rajt. Sztem.

Új hozzászólás Aktív témák