Newsgroup: it.comp.lang.c++
Titolo: memoria dinamica (principiante)

Scusate la domanda forse per voi banale....
Che vantaggi/svantaggi posso avere nell'utilizzare la memoria dinamica al
posto di quella normale?
prestazioni?
Ci sono situazioni non risolvibili se non con l'allocazione della memoria
dinamica?
grazie

 posto di quella normale?
Innanzi tutto mi puoi dare la definizione di memoria normale e quella di 
memoria dinamica?
-- 
Luc.


wrote:

come memoria dinamica intendera' l'allocazione della memoria durante
l'esecuzione del programma, piuttosto che l'allocazione statica
all'interno del codice con frammenti del tipo oggetto
array_oggetto[x]; 
i vantaggi sono dati nella minor dimensione del codice eseguibile..
gli svantaggi sono da ricercarsi nel dover assicurarsi che
l'allocazione sia stata effettuata in modo corretto, e nel ricordarsi
di deallocare la memoria allocata
antonio

 di deallocare la memoria allocata
Non è uno svantaggio, è una cosa necessaria...
PS: non ci sono vantaggi/svantaggi clamorosi, dipende da ciò che si deve 
fare. Per una particolare cosa, quindi, usare uno o l'altro metodo porta 
a vantaggi o a svantaggi.
-- 
Luc.

 
non vi sembra di essere un po' sommari??? il vero vantaggio (e non e' cosa 
da poco, anzi...) e' la flessibilita' della memoria dinamica: si alloca 
solo quella che serve alla singola esecuzione, ossia se ne serve poca si 
risparmia memoria, se ne serve tanta se ne puo' ottenere una quantita' 
potenzialmente infinita e solo quando serve...
per quanto riguarda gli usi specifici, per iniziare, penso che almeno per 
lavorare con strutture come grafi o alberi sconsiglierei VIVAMENTE l'uso di 
memoria statica...

 memoria statica...
Quello è ovvio!
-- 
Luc.

 ha scritto nel messaggio
news:MPG.179ca0845...@tornado.fastwebnet.it...

Per memoria normale (chiedo scusa per l'imprecisione) intendo in effetti
quella statica, senza l'utilizzo di new (malloc).
Ho difficolta a capire perche' in alcune situazioni dovrei utilizzare l'heap
piuttosto che il segmento di dati per memorizzare una variabile o un oggetto
di una classe

 a écrit dans le message news:
j715jucmuheg2g69p...@4ax.com...

A volte l'allocazione di memoria dinamica e' non solo vantaggiosa dal punto
di vista della dimensione dell'eseguibile ma necessaria.
Immaginiamo un programma che deve analizzare e lavorare su grandi quantita'
di dati.
Deve costruire e memorizzare su grosse tabelle, databases, records, dati che
magari legge da files, poi li trasforma e ci fa le sue brave operazioni, per
poi alla fine memorizzare dei risultati su altre tabelle.
A questo punto tutta la memoria che aveva utilizzato per la preparazioe di
questo lavoro potrebbe essere rilasciata, e magari durante l'esecuzione del
programma si dovra' rifare un lavoro analogo per altre tabelle, ma con un
diverso quantitativo di memoria che dipende da quali files si dovra'
leggere.
Per cui se dovessimo utilizzare solo della memoria statica, a priori non
sapremmo quanta allocarne, poiche' la quantita' la si conoscera' solo
durante l'esecuzione del programma, e magari dipende anche dagli input
dell'utente/cliente.
In secondo luogo, se anche conoscessimo la quantita' di memoria da allocare,
questa dovra' essere riservata per tutta la durata del programma, perche'
non potremmo rilasciarla come avremmo potuto nel caso di memoria dinamica.
Per cui ci potrebbero essere problemi di mancanza di memoria, quando
dovremmo fare altre operazioni (del tutto diverse e che quindi non possono
sfruttare la memoria allocata staticamente da operazioni precedenti) che
richiedono ulteriori allocazioni di memoria, che avrebbero potuto sfruttare
la memoria rilasciata da operazioni precedenti.
A meno che non si voglia trovare la massima allocazione di memoria statica
necessaria in un programma e sfruttarla per qualsiasi tipo di operazione che
la andra' ad utilizzare come se fosse un pool, ed in effetti si tratterebbe
di un'implementazione di gestione di memoria...che gia' esiste nel C++
standard e si chiama new/delete.
Altro problema per la memoria allocata staticamente e' che la dimensione
dello stack all'interno di un metodo/funzione potrebbe essere inferiore al
numero di bytes allocati staticamente al suo interno + numero di bytes
necessari per il passaggio dei parametri ecc..
Se all'interno di una funzione si ha bisogno di allocare una gran quantita'
di dati non piu' necessari una volta terminata la funzione, allora si
utilizza l'allocazione dinamica.
Forse ho dimenticato altri vantaggi/svantaggi
Maurus

 a vantaggi o a svantaggi.
puoi farmi un esempio in cui dovrei utilizzare la memoria dinamica piuttosto
che quella statica?
Nel caso delle liste? I testi che ho utilizzano la dinamica.....

OK
grazie
afferrato il concetto

 effetti quella statica, senza l'utilizzo di new (malloc).
ho notato che molti in questo thread anno utilizzato erroneamente il 
termine "memoria statica"; in effetti ci sono tre tipi di memoria:
*** Statica:
ne fanno parte le variabili globali, quelle statiche all'interno di un 
modulo, quelle statiche all'interno di una funzione e quelle statiche 
all'interno di una classe
*** Automatica:
e` quella allocata "sullo stack" e, presumo, quella di cui stavate 
parlando in questo thread; in pratica e` usata da tutte le variabili 
definite all'interno di funzioni e metodi
*** Dinamica
quella allocata con new
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 ciao Anto
Hai ragione,
in effetti avevo usato il termine "memoria statica" per intendere la memoria
non dinamica.
Ma tutto il ragionamento era fatto sulla memoria automatica per quanto
riguarda lo stack(variabili locali e parametri di funzioni e metodi) e su
quella statica per le variabili globali e statiche.
Grazie per la precisazione.
Maurus