Newsgroup: it.comp.lang.c
Titolo: gestione della memoria

salve a tutti, scrivendo un programma distribuito su piu' file mi sono
venuti alcuni dubbi riguardo la gestione della memoria di variabili e
funzioni
All' interno di una funzione dichiaro un array int a[100]... al termine
della funzione l' array viene distrutto e la memoria recuperata, e fin
qui non ci piove.
se invece faccio una allocazione con malloc o simili dentro una
funzione, al termine della funzione la memoria allocata non viene
distrutta, se il puntatore ad essa viene assegnato ad una variabile
esterna alla funzione. Ecco il quesito: l 'allocazione di memoria
conviene di piu' farla ad un livello di visibilita' pari a quello della
variabile che punta ad essa o puo' essere fatto indifferentemente in
qualsiasi punto di un programma, anche all'interno di funzioni diverse,
senza differenze di efficienza o di frammentazione della memoria?
grazie
Ivan

 memoria?
  Purtroppo efficienza e frammentazione del core non sono argomenti
trattati dallo standard, essendo attinenti alle politiche del
compilatore e del sistema operativo in materia di gestione della memoria
volatile.
  In linea di massima, non ci dovrebbero essere differenze sostanziali
(l'accesso alla memoria e` una delle operazioni piu` veloci effettuabili
da un calcolatore).
	Alla prossima,
		Marco

 senza differenze di efficienza o di frammentazione della memoria?
Forse vuoi chiedere se la chiamata a free() deve essere messa nello
stesso blocco in cui č messa la malloc(), giusto? Certo, sarebbe meglio.
Ma a volte serve diversamente. Tieni solo presente che i puntatori sono
una delle prime cause di errori nei programmi C e quindi č meglio
gestirli nel modo piů chiaro e pulito possibile.
EMG

 ...zippete...
Mi avete fatto venire in mente un quesito
che mi ha roso per un pochino, tempo fa,
ma non ne sono mai venuto a capo.
E' possibile leggere l'arena di un programma?
(l'arena la tabella che contiene tutte le
allocazioni fatte, con relativa lunghezza)
Ho cercato tanto una chiamata di sistema che
mi permettesse di farlo, ma non l'ho trovata.
Eppure un modo c'è, altrimenti come fafarebbe
la free a liberare la memora, da qualche 
parte dovrà pur vedere quanto è grande l'area
puntata dal puntatore che gli viene passato.
Potrei scrivere dei bei garbage collector :)
Nicola.

 farlo, ma non l'ho trovata.
  E` una questione dipendente dal sistema operativo. Dare un'occhiata ai
sorgenti della libreria standard del C, ove disponibile, potrebbe darti
risposte interessanti.
	Alla prossima,
		Marco


Uhm, ma da chi è gestita l'arena, dalla libreria malloc, o dal kernel?
Io sviluppo su Solaris, ho provato a fare il truss (programma che mostra
tutte le chiamate di sistema) di un programmino che fa una semplice
malloc,
ma non ho visto nessuna chiamata di sistema per la malloc, da ciò
intuisco
che l'allocazione è gestita dalla libreria c. Quindi se è la libreria
malloc
che si occupa della gestione e della manutenzione dell'arena, ci
dovrebbero
essere delle chiamate standard per leggerla.
Dico cazzate?

 chiamate standard per leggerla. Dico cazzate?
  Non del tutto. Se il tuo scopo e` implementare un GC di medio livello,
probabilmente ti basta soltanto spulciare la libreria standard. Il
metodo della gestione della memoria, pero`, e` comunque dipendente dalla
piattaforma: sebbene il compilatore possa fare pesanti assunzioni, non
credo che sia possibile svincolarsi dal sistema operativo.
	Alla prossima,
		Marco

 allocazioni fatte, con relativa lunghezza)
su linux con glibc c'e` la funzione mtrace() (e muntrace()) che scrive
tutte le allocazioni, deallocazioni, resize su di un file
su SunOS ci protrebbe essere qualcosa di simile
ciao
Kronos
-- 
Home: 
http://kronoz.tsx.org
Se alla sera, dopo una strepitosa vittoria, guardandoti allo
specchio dovessi notare un secondo paio di palle, che il tuo 
cuore non si riempia d'orgoglio, perche' vuol dire che ti 
stanno inculando -- Saggio Cinese

 
Beh, saprei fare creando delle funzioni che stanno ad un livello
superiore
della malloc, mi gestirei io una tabella... e sarei anche multi
piattaforma.
Salutoni Nicola.

 sarei anche multi piattaforma.
  Esistono centinaia di "miglioramenti" della malloc() standard. Per
esempio, anche la GLib ne propone una, g_malloc(), che potrebbe essere
per te un buon inizio.
	Alla prossima,
		Marco