Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C# - Memory (razlika između C++ i C# )

[es] :: .NET :: C# - Memory (razlika između C++ i C# )

[ Pregleda: 2142 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

VictoriaV
Zagreb, Hrvatska

Član broj: 182308
Poruke: 8
*.adsl.net.t-com.hr.



Profil

icon C# - Memory (razlika između C++ i C# )02.07.2008. u 15:24 - pre 192 meseci
Pozdrav svima :-)

Dolazim iz 'C++ svijeta'. Meni su poznati pojmovi stack i heap. Razlike između 'C++'-ovskog i 'C#'-ovskog svijeta po pitanju memorije bi bile ... ? Znam da je garbage collector memory manager ...

Unaprijed se zahvaljujem,

Victoria


Carpe Diem
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: C# - Memory (razlika između C++ i C# )02.07.2008. u 16:46 - pre 192 meseci
pa jedina bitna razlika izmedju memory managmenta kod c++a i c#a je upravo garbage collector, tj kod c++a za svaki new moras da imas odgovarajuci delete (sto ume da bude smorno :D) dok kod c#a samo imas new a garbage collector se da se pobrine da sva memorija bude oslobodjeno jednom kad ne bude bila potrebna vise.

i jos jedna stvar je sto se kod c#a pokazivaci (pointeri) smatraju unsafe kodom, i njihova upotreba je svedena na minimum (u 90% slucajeva ti nece biti potrebno baratanje memorijom preko pokazivaca)
 
Odgovor na temu

VictoriaV
Zagreb, Hrvatska

Član broj: 182308
Poruke: 8
87.252.147.*



Profil

icon Re: C# - Memory (razlika između C++ i C# )05.07.2008. u 12:44 - pre 192 meseci
Citat:
Aleksandar Ružičić: pa jedina bitna razlika izmedju memory managmenta kod c++a i c#a je upravo garbage collector, tj kod c++a za svaki new moras da imas odgovarajuci delete (sto ume da bude smorno :D)


Defintivno je 'sumorno' :-). Pogotovo u slučajevima kada održavanja, ugrađivanja nekih novih funckionalnosti. :-)


Citat:
Aleksandar Ružičić:
i jos jedna stvar je sto se kod c#a pokazivaci (pointeri) smatraju unsafe kodom, i njihova upotreba je svedena na minimum (u 90% slucajeva ti nece biti potrebno baratanje memorijom preko pokazivaca)


Kolio sam shvatila sada su pointeri 'upakirani' u klasu (delegate ? tek sam na početku sa učenjem C# pa se unaprijed ispričavam ako pitam neke osnovne stvari :-) )
Carpe Diem
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: C# - Memory (razlika između C++ i C# )05.07.2008. u 13:10 - pre 192 meseci
ne, delegate je nesto drugo, delegate je pointer na member fju klase (nije isto sto i klasican pokazivac na funkciju, delegate pored adrese fje cuva i adresu objekta, tj bar bi tako trebalo ja sam nov u C#-u ali iz D-a znam sta su delegati)

ti mozes da koristis klasicnu pokazivacku aritmetiku na koju si navikla u c/c++ ali takav kod mora da bude unutar unsafe bloka, recimo:
Code:

unsafe
{
    int num = 42;
    int* ptr = #
    Console.WRiteLine(*ptr);
}

 
Odgovor na temu

Mare34
Marko Novakovic
Web Developer
Westum
Belgrade

Član broj: 30613
Poruke: 124
*.dynamic.sbb.rs.



Profil

icon Re: C# - Memory (razlika između C++ i C# )06.07.2008. u 14:05 - pre 192 meseci
Jedna od velikih gresaka koju prave programeri jezika sa automatskim ciscenjem memorije je sledeca:

Neuklanjanje starih i beskorisnih referenci

Pogledajmo primer:

Code:

public class Stack
{
    private SomeClass[] elements;
    private int top;
    private int capacity;

    public Stack(int capacity)
    {
        this.capacity = capacity
        elements = new SomeClass[capacity];
        top = 0;
    }

    public Push(SomeClass newElement)
    {
        if (top == capacity - 1)
        {
            SomeClass[] temp = elements;
            capacity *= 2;
            elements = new SomeClass[capacity];
            Array.Copy(temp, elements, capacity); 
        }
        elements[++top] = newElement;
    }

    public SomeClass Pop()
    {
        if (top < capacity / 2)
        {
            SomeClass[] temp = elements;
            capacity /= 2;
            elements = new SomeClass[capacity];
            Array.Copy(temp, elements, capacity); 
        }
        return elements[top--];        
    }
}


Naizgled metoda Pop je potpuno u redu.
Ali zamislimo situaciju da smo inicirali kapacitet od oko 1000 elemenata.
Pritom smo dodali oko 1900 i stek je uzeo 2000 referenci.
Sada zamislimo da smo pokupili sa steka oko 800 elemenata.
Sada imamo na steku oko 1100 elemenata, ali i onih 800 sto nismo dereferencirali.
Tako da ako bi se na steku vrteo broj elemenata oko 1100, onih 800 bi bez veze opterecivali memoriju.
Sada zamislimo da nije u pitanju 1000 i 2000 objekata, nego 100.000 i 200.000.
Desavalo bi se da izbaci exception za prekoracenje memorije,
da ne pricam o tome da se ovakva komponenta koristi na vise mesta.

pogledajmo izmenjenu verziju metode Pop

Code:

public SomeClass Pop()
{
    if (top < capacity / 2)
    {
        SomeClass[] temp = elements;
        capacity /= 2;
        elements = new SomeClass[capacity];
        Array.Copy(temp, elements, capacity); 
    }
    SomeClass temp = elements[top];
    elements[top] = null;                      //   Garbage collector ce se pobrinuti da ukloni beskorisnu referencu
    top--;
    return temp;    
}


U izmenjenoj verziji ce se garbage collector pobrinuti da ocisti referencu koju ne koristimo i tako oslobodi memoriju.
 
Odgovor na temu

[es] :: .NET :: C# - Memory (razlika između C++ i C# )

[ Pregleda: 2142 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.