View Full Version : [c++] vantaggi allocazione dinamica
mistergks
30-11-2012, 11:28
Ho dei dubbi..ho cercato un po in giro ma ho trovato notizie che mi hanno confuso..
Le domande sono perché e quando scegliere di allocare dinamicamente una matrice?! Cioe quali sono i vantaggi? (e gli svantaggi)?!
In memoria costa meno una matrice dinamica di una statica?
Inoltre come si alloca una matrice dinamica?
Non trovo risposta da nessuna parte. Help me..
Inviato dal mio GT-I9003 usando Tapatalk
A grandi linee
Fondamentalmente usi un'allocazione dinamica di un'array quando non puoi definire la la grandezza se non a runtime.
Lo svantaggio principale e' che per gestire un'allocazione dinamica dovrai scrivere del codice per "gestire" il puntatore alla matrice creata.
Considera che in c++ ti puoi appoggiare a classi che ti mascherano gran parte del lavoro di gestione
ovviamente un'allocazione dinamica ottimizza l'occupazione di memoria, xche' puoi utilizzare esattamente la quantita' che ti occorre.
Pensa un wordprocessor. aprendo un foglio bianco non sai ne quante righe scriverai e neppure di che lunghezza.
puoi optare x dei limiti preimpostati (rigcol[100][100]; ovvero 100 righe da 100 caratteri) oppure allocare dinamicamente di volta in volta sia la quantita di righe che la loro lunghezza.
Quindi se apro un foglio e scrivo solo "A" nel caso statico alloco 100x100=10000byte mentre nel caso dinamico alloco 1byte....
per allocare usi :
c++ ->>> new()
c ->>> malloc()
Spero di essere stato chiaro....:)
A grandi linee
Fondamentalmente usi un'allocazione dinamica di un'array quando non puoi definire la la grandezza se non a runtime.
Lo svantaggio principale e' che per gestire un'allocazione dinamica dovrai scrivere del codice per "gestire" il puntatore alla matrice creata.
Considera che in c++ ti puoi appoggiare a classi che ti mascherano gran parte del lavoro di gestione
ovviamente un'allocazione dinamica ottimizza l'occupazione di memoria, xche' puoi utilizzare esattamente la quantita' che ti occorre.
Pensa un wordprocessor. aprendo un foglio bianco non sai ne quante righe scriverai e neppure di che lunghezza.
puoi optare x dei limiti preimpostati (rigcol[100][100]; ovvero 100 righe da 100 caratteri) oppure allocare dinamicamente di volta in volta sia la quantita di righe che la loro lunghezza.
Quindi se apro un foglio e scrivo solo "A" nel caso statico alloco 100x100=10000byte mentre nel caso dinamico alloco 1byte....
per allocare usi :
c++ ->>> new()
c ->>> malloc()
Spero di essere stato chiaro....:)
Inoltre lo stack ha una dimenisone definita a priori ed è << della memoria utilizzabile nel sistema
mistergks
30-11-2012, 17:40
Solo new?!???
lorenzo001
30-11-2012, 19:06
Che vuol dire "solo new" ?
[Kendall]
30-11-2012, 19:07
Bisogna ricordare inoltre che, generalmente, l'allocazione dinamica (quando comincia ad essere intensiva) risulta prestazionalmente molto inferiore nel C++ che non in linguaggi con garbage collector come C# o Java, per il principio stesso che sta dietro all'allocazione e deallocazione della memoria.
In genere comunque quando puoi alloca sempre staticamente, lo stack per concezione stessa è estremamente più rapido prestazionalmente.
Certo, questi son principi generali, poi in realtà le considerazioni da fare sono davvero molte e dipendono dall'applicazione.
mistergks
01-12-2012, 12:53
Che vuol dire "solo new" ?
Come si dichiara l allocazione dinamica? Solo new e basta?
Inviato dal mio GT-I9003 usando Tapatalk
Come si dichiara l allocazione dinamica? Solo new e basta?
Inviato dal mio GT-I9003 usando Tapatalk
Dai un'occhiata...
http://www.cplusplus.com/reference/new/operator%20new[]/
http://it.wikipedia.org/wiki/Array_in_C%2B%2B
Su wiki puoi trovare anche info su stack ed heap...
mistergks
03-12-2012, 14:56
Dai un'occhiata...
http://www.cplusplus.com/reference/new/operator%20new[]/
http://it.wikipedia.org/wiki/Array_in_C%2B%2B
Su wiki puoi trovare anche info su stack ed heap...
Grazie! A che serve quel for?!
For (int i=0; i<100; i++)
Array[i]=new int [n];
Va dichiarato ogni elemento quindi ?
Inviato dal mio GT-I9003 usando Tapatalk
[Kendall]
03-12-2012, 15:30
Grazie! A che serve quel for?!
For (int i=0; i<100; i++)
Array[i]=new int [n];
Va dichiarato ogni elemento quindi ?
Inviato dal mio GT-I9003 usando Tapatalk
Con quel for genera 100 array di int di dimensione n, e li associa uno per uno alla posizione i-esima di quell'array di puntatori a int. (ogni puntatore quindi punterà alla prima posizione di uno di quei 100 array di int).
tomminno
03-12-2012, 17:22
;38634338']Bisogna ricordare inoltre che, generalmente, l'allocazione dinamica (quando comincia ad essere intensiva) risulta prestazionalmente molto inferiore nel C++ che non in linguaggi con garbage collector come C# o Java, per il principio stesso che sta dietro all'allocazione e deallocazione della memoria.
Questa "inefficienza" la recuperi tutta nel momento in cui il GC blocca tutti i thread per recuperare la memoria non usata...
Per non parlare dei problemi del .Net a gestire il Large Object Heap.
Anche nel mondo managed esistono i problemi di gestione della memoria...
[Kendall]
03-12-2012, 17:32
Questa "inefficienza" la recuperi tutta nel momento in cui il GC blocca tutti i thread per recuperare la memoria non usata...
Per non parlare dei problemi del .Net a gestire il Large Object Heap.
Anche nel mondo managed esistono i problemi di gestione della memoria...
Assolutamente, e infatti è fuori discussione che nel suo totale il C++ sia un linguaggio più performante. Commentavo solo il singolo aspetto dell'allocazione dinamica, cosa che appunto è prestazionalmente migliore nei linguaggi managed. Che poi il GC abbia due facce della medaglia è poco ma sicuro, anche quello si deve sapere come utilizzare per bene.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.