[ VictoriaV @ 02.07.2008. 15:24 ] @
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

[ Aleksandar Ružičić @ 02.07.2008. 16:46 ] @
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)
[ VictoriaV @ 05.07.2008. 12:44 ] @
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 :-) )
[ Aleksandar Ružičić @ 05.07.2008. 13:10 ] @
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);
}
[ Mare34 @ 06.07.2008. 14:05 ] @
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.