Newsgroup: it.comp.lang.c
Titolo: HEAP E GARBAGE COLLECTION

Ciao a tutti. Nell'introduzione del K&R c'è scritto:
" Nel linguaggio C...non esistono né uno heap, nè un meccanismo di garbage
collection".
Che vogliono dire questi due paroloni?
Grazie
(mi inchino alla vostra sapienza :D )

Che vogliono dire questi due paroloni?
Approssimativamente:
Le variabili 'globali' del C usano uno spazio di memoria di dimensioni
fisse, se ad esempio dichiari (fuori dalle funzioni) una stringa di 10
caratteri (es: char *s = "123456789"), non sara' possibile cambiarne
il contenuto con una piu' lunga, quello spazio rimarra' di 10
caratteri.
Nelle funzioni, le variabili dichiarate (eccetto le static) vengono
allocate in un altra area, lo stack. L'area di stack allocata, non
potra' essere ridimensionata, come per le variabili globali, al
termine della funzione lo spazio di stack sara' rilasciato.
In alcuni linguaggi si usa l'heap, e' una zona di memoria in genere
utilizzata per le stringhe. Heap significa disordine o qualcosa del
genere. Se ho dichiarato una stringa di 10 caratteri e successivamente
la sostituisco con una da  50 caratteri, il gestore della memoria
marchia la stringa originale come obsoleta (senza cancellarla) e ne
alloca una nuova.
Periodicamente il gestore di memoria effettuera' la Garbage Collection
(Raccolta della Spazzatura) eliminando le stringhe cancellate e
compattando gli spazi, un po' come avviene quando si fa la
deframmentazione di un disco rigido.
Questo sistema ha il vantaggio di poter gestire lo spazio in maniera
dinamica, il prezzo da pagare e' il tempo perso durante la Garbage
Collection.
Il C usa un sistema simile attraverso la famiglia funzioni *alloc(),
che pero' essendo implementate come funzioni, giustamente non vengono
considerate parte del linguaggio. Puoi scegliere se usarle o meno a
tuo piacimento.
ciao, acc.   
a...@libero.it

Che vogliono dire questi due paroloni?
Heap, che non vuol dire "disordine", ma pila/catasta e' il
nome che viene generalmente dato alla memoria "dinamica",
ovvero quella parte della memoria di un sistema che viene
allocata/espansa/deallocata in modo molto variabile durante
tutto il corso del programma.  
Questa memoria puo' essere presa in prestito e rilasciata a
piacimento e nella quantita' voluta, a patto che si
rispettino i suoi limiti, ovviamente. 
Il garbage collector e' quella parte di un sistema, capace
di compiere la cosiddetta "raccolta della spazzatura"
("garbage collection" in inglese), ovvero di individuare
quelle porzioni di memoria non piu' utilizzate e renderle
nuovamente disponibili per ulteriori allocazioni.
I garbage collector sono dei processi un po' troppo pesanti
e sono tipici dei linguaggi interpretati, piu' che di
linguaggi tipicamente compilati (perche' sono gestiti
dall'interprete).  
Un linguaggio come il C non prevede di default garbage
collection (come potrebbe ? e' solo un linguaggio), ma non
e' detto che uno dei suoi ambienti di sviluppo non ne
implementi uno. 
Ad esempio, la VM Java, che e' un ambiente che interpreta il
byte-code Java, possiede un meccanismo di garbage
collection.
Ne' il C, ne' il C++ ne prevedono uno.
--
CyberWalkie - walkietalkie(at)
libero.it

grazie mille per le spiegazioni.
Ciao
"CyberWalkie" <cyber...@cyberwalkie.cyb> ha scritto nel messaggio
news:3b4940d8...@news.libero.it...


grazie mille per le spiegazioni.
Una nota che non vuol essere polemica : su USENET e' gradito
che non vi siano ringraziamenti e che non venga riportato
l'intero testo a cui si sta rispondendo, nella propria
risposta.
--
CyberWalkie - walkietalkie(at)
libero.it

implementi uno. 
ok, vada per la garbage collection. Perņ nel messaggio originale si
specificava che il C non prevede neppure lo heap: e allora
malloc/free? Anche se sono funzioni di libreria fanno parte a tutti
gli effetti del linguaggio.
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

gli effetti del linguaggio.
malloc/free sono due interfacce per l'allocazione di
memoria.  Le specifiche del linguaggio non obbligano ad
assumere alcun comportamento se non quelli definiti
dall'interfaccia (ritornare NULL, per esempio, in caso di
allocazione fallita), ma che poi internamente richiamino
GlobalAlloc o una qualsiasi API di un qualsiasi sistema
operativo, non e' sicuramente stabilito da regole standard
(non sarebbero + standard).
--
CyberWalkie - walkietalkie(at)
libero.it

memoria.
Mi sembra che in termini diversi state dicendo la stessa cosa
Trovi sbagliata questa definizione:
malloc/free sono due funzioni di libreria per la gestione di un heap,
sul quale non e' prevista la Garbage Collection.
ciao, acc.   
a...@libero.it

malloc/free sono due funzioni di libreria per la gestione di un heap,
Non e' detto che malloc/free gestiscano uno heap, quindi non
facciamo confusione.
--
CyberWalkie - walkietalkie(at)
libero.it