PDA

View Full Version : [C++]Garbage Collector


maxithron
16-01-2004, 22:32
Mi chiedevo quale fosse il vantaggio di usarlo al posto della gestione manuale della memoria dinamica....

Delucidazioni in merito?

Luc@s
17-01-2004, 06:06
in teoria dovrebbe permettere di nn preoccuparsi di alocare/disallocare oggetti.
IMHO è uno dei motivi per cui Java è cosi pesante da eseguire, perche vengono eseguiti periodicamente dei controlli che degradano, sempre IMHO, un po le prestazioni.



;)

/\/\@®¢Ø
17-01-2004, 12:24
Originariamente inviato da maxithron
Mi chiedevo quale fosse il vantaggio di usarlo al posto della gestione manuale della memoria dinamica....

Delucidazioni in merito?
La gestione manuale della memoria ha diversi problemi:
- porta via tempo al programmatore
- e' fonte di un numero maggiore di errori
- In programmi molto complessi e' difficile stabilire in modo chiaro quando della memoria non serve piu' (e quando serve ancora), questo fa si' che il software tenda a perdere memoria oppure che si debba ricorrere ad un framework per la gestione della memoria; quest'ultimo puo' avere anche un costo maggiore di un buon garbage collector (visto che quest'ultimo puo' lavorare in modo incrementale su di un thread parallelo, e quindi evitare lunghe pause per la liberazione della memoria)

maxithron
17-01-2004, 14:15
mmmhhh.... quindi queste considerazioni mi fanno pensare di favorire questa tenica anche in funzione di "costi" a livello di affidabilità e portabilità nonchè esecuzione se parliamo lato "tecnico".

Bene.

Quindi, se volessi impedire altri accessi ad un qualsiasi oggetto che non viene più referenziato, mi basterebbe assegnargli un valore pari a zero per fare in modo che un oggetto successivo possa sfruttare l'area di memoria così liberata?

Luc@s
17-01-2004, 14:20
Originariamente inviato da maxithron
Quindi, se volessi impedire altri accessi ad un qualsiasi oggetto che non viene più referenziato, mi basterebbe assegnargli un valore pari a zero per fare in modo che un oggetto successivo possa sfruttare l'area di memoria così liberata?

Penso che funzi cosi :)

maxithron
17-01-2004, 14:31
quindi sarebbe corretto così?



{
int* a = new int;
a = 0;
char* b = new char;
}

/\/\@®¢Ø
18-01-2004, 00:46
Originariamente inviato da maxithron
quindi sarebbe corretto così?



{
int* a = new int;
a = 0;
char* b = new char;
}


Quasi. Nel caso del C++ devi far sapere alla libreria che vuoi usare il garbage collector, e quindi la sintassi giusta (per l'unica libreria di g.c. che conosco) e' la seguente

{
int* a = new (gc) int;
a = 0;
char* b = new char;
}

Puoi inoltre decidere di eliminare direttamente la memoria con una delete, anche se ovviamente devi essere sicuro di non utilizzarla altrove.

Tieni presente pero' che se ti appoggi al g.c., la deallocazione effettiva puo' avvenire in qualsiasi momento, anche alla fine dell'esecuzione del programma.

Ad esempio:

class Test : gc
{
public:
Test(int n){ m=n; cout << "Costruttore " << n <<endl; }
~Test(){ cout << "Distruttore " << m << endl; }
int m;
};

...
{
Test* t = new Test(1);
t=0;
Test* t2 = new Test(2);
...
}


Non hai garanzia sull'ordine dell'output
potrebbe essere uno qualsiasi dei seguenti

Costruttore 1
Costruttore 2
Distruttore 1
Distruttore 2

Costruttore 1
Distruttore 1
Costruttore 2
Distruttore 2

Costruttore 1
Costruttore 2
Distruttore 2
Distruttore 1

/\/\@®¢Ø
18-01-2004, 14:11
Qui puoi trovare un esempio (l'unico che conosca a dire il vero) di Garbage Collector per C++.
Ci sono inoltre diversi link e documenti interessanti sulla G.C., nel caso tu voglia approfondire un po'.
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

maxithron
18-01-2004, 21:50
Quindi ritornando al dubbio che avevo, è una tecnica da usare prevalentemente con "completa coscienza". Leggevo infatti che anche lo standard non la prevede.

maxithron
18-01-2004, 21:51
Originariamente inviato da /\/\@®¢Ø
Qui puoi trovare un esempio (l'unico che conosca a dire il vero) di Garbage Collector per C++.
Ci sono inoltre diversi link e documenti interessanti sulla G.C., nel caso tu voglia approfondire un po'.
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Il link è davvero buono. Grazie!

mjordan
19-01-2004, 12:39
Originariamente inviato da /\/\@®¢Ø
Qui puoi trovare un esempio (l'unico che conosca a dire il vero) di Garbage Collector per C++.
Ci sono inoltre diversi link e documenti interessanti sulla G.C., nel caso tu voglia approfondire un po'.
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Già ma a quanto pare quello è anche l'unico che si sia preso in seria considerazione. Fa parte anche del compilatore ufficiale Java GNU (GCJ).

mjordan
19-01-2004, 12:42
Originariamente inviato da Luc@s
in teoria dovrebbe permettere di nn preoccuparsi di alocare/disallocare oggetti.
IMHO è uno dei motivi per cui Java è cosi pesante da eseguire, perche vengono eseguiti periodicamente dei controlli che degradano, sempre IMHO, un po le prestazioni.



;)

Le considerazioni sono corrette ma c'è di +. Java a un garbage collector che opera su codice potenzialmente multi-threaded interpretato.

Oltre che Swing non mi elettrizza più di tanto, questo è uno dei motivi che non lo fanno annoverare fra i miei linguaggi di programmazione preferiti. Per quanto riguarda i linguaggi interpretati, dal poco che ho visto preferisco python.

maxithron
20-01-2004, 23:12
Originariamente inviato da mjordan
Le considerazioni sono corrette ma c'è di +. Java a un garbage collector che opera su codice potenzialmente multi-threaded interpretato.

Oltre che Swing non mi elettrizza più di tanto, questo è uno dei motivi che non lo fanno annoverare fra i miei linguaggi di programmazione preferiti. Per quanto riguarda i linguaggi interpretati, dal poco che ho visto preferisco python.

In effetti ero tentato anch'io di cominciare a darci uno sguardo....ma, devo prima inventarmi una funzione che mi dilati lo spazio-tempo :D