Newsgroup: it.comp.programmare.win32
Titolo: Memoria

Ho visto che ci sono 50 tipi di "memoria" che un programma può richiedere
(Global, Local, Virual, Heap, ecc...). Ma quando, dal C++, uso l'operatore
new, che succede?
--
PLEASE ANSWER HERE, NOT BY EMAIL
Stefano Pettini
ICQ#: 38328322
Notary of 
www.thawte.com



- Global e Local (condivisa o no) sono diverse aree di memoria tipiche della
programmazione multiprocessore o con processi concorrenti: l'area Global è
visibile a tutti, l'area local solo al singolo processore/processo.
- Virtual (memoria virtuale) è una tecnica utilizzata per espandere la
capacità di memoria indirizzabile dal processore in modo da far fronte a
scarsità di ram fisica o per limitazioni di indirizzamento (dovuti al bus).
La memoria virtuale viene impaginata e con diverse tecniche viene
caricata/scaricata su disco (o su altra memoria). Questa tecnica viene
interamente gestita dal S.O. ed è completamente trasparente al programmatore
- Heap è la memoria assegnata ad un processo dal sistema operativo a
run-time: nel caso della new la memoria che ti viene data è dello heap
- Stack è parte della memoria assegnata al processo e serve per gestire
tipicamente l'annidamento di funzioni/procedure e passaggio parametri (ma
non solo!). La il nome di questa area di memoria deriva dalla sua gestione a
LIFO

visibile a tutti, l'area local solo al singolo processore/processo.
Sicuro ?
In windows 32 bit mi sembra invece che non vi sia nessuna differenza
tra la memoria Local e Global .

Non è proprio così.
In Win32 non esistono più le funzioni di allocazione "locale" (LocalAlloc,
ecc...) perché non c'è più distinzione tra memoria locale e globale. Cioè,
le funzioni esistono ancora, ma solo per compatibilità con Win16. Tutta la
memoria allocata da un processo è accessibile esclusivamente da tale
processo (diverso è il discorso per le DLL). Per utilizzare memoria
condivisa tra più processi bisogna sfruttare il file-mapping.
La definizione di "heap" sta ad indicare genericamente la parte di memoria
assegnata ad un processo. Si tratta comunque di memoria virtuale, nel senso
che il blocco allocato potrebbe non essere mappato esclusivamente su memoria
"fisica". Nessuna distinzione viene fatta, come invece era in passato, tra
memoria locale e globale. Le stesse funzioni GlobalAlloc e LocalAlloc,
presenti solo per backward-compatibility, non fanno altro che eseguire le
corrispondenti funzioni di gestione dello heap (HeapCreate, HeapAlloc,
ecc...). Microsoft sconsiglia di usare GlobalAlloc/LocalAlloc in quanto sono
più lente a causa dell'overhead necessario per mantenere il vecchio stile di
accesso alla memoria (lock/unlock).
Le funzioni di gestione della memoria presenti nelle librerie C standard
utilizzano, sotto Win32, le API di gestione dello heap.
Ciao a tutti,
    Marco

 tra la memoria Local e Global .
Si, hai ragione, sono andato a memoria e mi sono confuso:
per dare una ripassata sono andato a sfogliare l'MSDN per vedere la gestione
dei multiprocessori, ma non ho trovato granchè:
mi sembrava di ricordare che si potessero creare processi concorrenti
eseguiti parallelamente da più processori (chiaramente solo in NT), avendo a
disposizione una funzione che restituiva il numero di processore che stava
eseguendo il processo e la possibilità di definire variabili condivise a
tutti i processori e variabili locali...... ma ho bevuto troppo?
grazie a tutti e scusate la svista



 new, che succede?
new alloca nello heap, che a sua volta e` allocato nella memoria
virtuale del processo (come del resto qualsiasi altra cosa).
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/