Newsgroup: it.comp.lang.c++
Titolo: Riallocazione dinamica della memoria

Salve a tutto l'ng,
vorrei sapere se c'e' in C++ un instruzione che corrisponde al
realloc del C o se c'e' qualcosa di simile per ingrandire la memoria gia'
allocata senza perdita dei dati.
Grazie anticipatamente per la risposta

 allocata senza perdita dei dati.
Ma certo.  Se usi il modo fondamentale previsto dal C++
per allocare dinamicamente memoria, cioe` std::vector<T>,
basta usare la sua funzione-membro .resize(N), dicendogli
quanti T vuoi che contenga da quel momento in avanti.  Ci
sono anche varie altre possibilita`, come .push_back per
aggiungere un solo elemento alla volta in coda, ecc, ecc.
#include <vector>
ti rende accessibile lo std::vector, naturalmente; poi
devi istanziarlo, ad esempio:
    std::vector<int> ilvettore;    // inizialmente vuoto
Se invece sei andato a impelagarti con new/delete/new[]/
delete[] e/o altri costrutti di bassissimo livello, "non
ti passa piu`".  Butta il tutto e riscrivilo con std::vector,
o per esigenze particolari std::string, std::list, ecc ecc,
e` il mio consiglio.
Alex

 e` il mio consiglio.
Ultimamente mi è capitato un cliente che non ne ha voluto sapere
(secondo lui per motivi di efficienza, si trattava di operazioni e
confronti tra righe di grandi matrici rappresentate in forma compatta)
di utilizzare né classi né tipi della libreria standard. Secondo te/voi
come si può in casi come questo convincere la persona (e anche se
stessi) che utilizzando le comodità offerte dal C++ non si va incontro a
programmi inaccettabilmente lenti? C'è un discorso inoppugnabile che si
può fare?
EMG

 wrote in message
news:38FC4B44...@flashnet.it...


 per allocare dinamicamente memoria, cioe` std::vector<T>,
....ma come, non si usava la "new", o eventualmente la malloc()?
ciao
tiberio

Lo dici perche' ti sei studiato il codice?
Ciao,
Nicola

....ma come, non si usava la "new", o eventualmente la malloc()?
Se vuoi allocare memoria e quindi usare gli array.
Ma se si parla di vettori (e quindi vector) e' un altro discorso : non
c'e' bisogno di allocare preventivamente memoria.

 può fare?
Se il pallino del tuo cliente fosse che solo il codice scritto
di martedi` e venerdi` e` privo di bug, e quello scritto di
mercoledi` un disastro, e quindi, con altrettanta logica, ti
proibisse di lavorare il mercoledi`, quale mai "discorso
inoppugnabile" potresti fargli?  Magari basta una Colt 45.
A fronte della totale, assoluta, e completa irrazionalita`,
non vedo come si possa "convincere" alcuno di alcunche`.  Le
armi da fuoco mi sembrano la soluzione piu` efficiente (quelle
da taglio potrebbero dare piu` soddisfazione nella loro piu`
lenta applicazione, ma qui si scivola sul sadismo, anche se,
in questo caso, pienamente giustificato).
Se ti paga a ore (comprese le ore di debug) e sei un tipo
venale, applaudi alle sue idee e convincilo anzi che non c'e`
di meglio dell'assembler, anzi del codice macchina binario
purissimo.  Cosi` invece di incassarti il lucro di 10 ore
di lavoro (con la libreria standard) o 20 (senza) ne cucchi
100.  E magari un 0.5% di velocita` qui lo guadagni pure.
Se ti paga a risultati, fingi altrettanto entusiasmo, poi,
di nascosto, fai tutto in Python (lavori 1/2 ora e ti fai
pagare per 20) usando naturalmente il modulo standard
Numerics (scritto e finemente ottimizzato da veri guru del
calcolo numerico, gente del Lawrence Livermore Lab).
Non preoccuparti se vuole esaminare i sorgenti, con la
conoscenza che mostra di avere del C++ non potra` certo
distinguere il tuo Python dal C++ -- se, al limite, nota
la totale assenza di punti-e-virgola e graffe (che un
poco salta agli occhi anche del bovino piu` totale),
spiegagli che hai ridotto al minimo l'uso di graffe e
punteggiatura cosi` il computer, non dovendo eseguire
quella, andra` piu` svelto.  Visto quanto ne capisce di
prestazioni, sara` entusiasticamente d'accordo, e anzi
ti chiedera` di ridurre anche la lunghezza dei nomi, per
la stessa ragione.
Alex

allocata senza perdita dei dati.
Icontenitori standard (in particolare std::vector) ti offrono tutto
cio', anche in automatico.
Paolo

 ma chiaramente è tutto invisibile a chi le usa.
Sono pronto a mettere in piedi una scommessa per una cifra
MOLTO sostanziale fra le prestazioni delle tue classi (grazie
soprattutto alla terribile realloc) e quelle di una decente
implementazione della libreria standard C++ (limitiamoci
pure a std::vector, e al compilatore piu` diffuso sul mercato,
MS Visual C++).
La cifra sara` meglio che sia alta, perche` senza dubbio il
numero di ore necessarie per stabilire i parametri esatti
della scommessa (i precisi vincoli semantici da rispettare)
sara` elevato, e io di soldi per ora ne prendo _parecchi_.
Il mio interesse e` soprattutto sfatare per sempre le balle
che ti sento asserire, ma non voglio rimetterci.
NB: di versioni "piu` piccole" di classi come std::vector
ne ho scritte anch'io, ma per uno scopo ben preciso: lavorando
con ATL, che incoraggia fortemente ad evitare del tutto l'uso
delle librerie del C (comprese naturalmente malloc e soci),
allo scopo di ottenere componenti davvero minuscoli per il
download dalla rete, volevo comunque avere una classe che mi
desse appunto le funzionalita` di (una parte di) vector _con
un minimo impiego di codice_.  Spingendo a fondo si riesce a
ridurre un componente dai 20-30 Kbyte minimi a 3 o 4 Kbyte
(con le runtime del C linkate, sarebbe impossibile).
Dove un risparmio di 16Kbyte circa di "footprint" e` del
tutto irrilevante (e/o e` accettabile il link dinamico delle
librerie runtime, cioe` nel 99+% delle situazioni), questo
non avrebbe senso.
Naturalmente, ho accuratamente copiato le migliori serie di
trucchi usate nelle tipiche implementazioni della libreria
standard C++ (Plauger, SGI, ecc); "l'imitazione e` la forma
piu` sincera di lode".  Non saro` arrivato pienamente alla
loro efficienza (non faccio lo scrittore di librerie di base
a tempo pieno: loro si`), ma i miei controlli Active/X, dove
serviva, sono stati di pochissimi K e il loro lavoro l'hanno
svolto comunque egregiamente.
Alex

 ....ma come, non si usava la "new", o eventualmente la malloc()?
Certo, dieci o quindici anni fa non c'erano alternative.
Per fortuna, il C++ da allora e` progredito enormemente.
Non altrettanto, purtroppo, la cultura dei alcuni dei
programmatori che dicono di usarlo, e di alcuni degli
autori dei libri che dicono di insegnarlo.
Alex

 c'e' bisogno di allocare preventivamente memoria.
Neanche con malloc/realloc/free, o se e` per questo con sbrk o
altre system call analoghe; puoi allocarla "alla bisogna" e non
"preventivamente".
Comunque le strategie -- e il livello di bilanciamento fra
automatismi, controllo da parte del programmatore, e semplicita` --
raggiunti nella libreria standard C++ sono eccezionali.  Appunto
per questo, se anche HAI esigenze particolari, ti conviene certo
incapsularle in un allocator (che so, per usare IMalloc::Allocate
ecc ecc invece che ::operator new, e cosi` via).
Si tratta di una _ottima_ fattorizzazione, e non vedo come fare
di meglio.
Alex

Non so se mi ha fatto piu´ sganasciare la battuta del bovino o quella della
velocita´ del pc in assenza di graffe.
Secondo me hai sbagliato lavoro, hai un futuro da cabarettista orientato a
oggetti! :)
MaurusPiKkIaTeLlO

"preventivamente".
Con "preventivamente" (forse il termine non e' giusto) mi riferisco ad
"appena prima dell'uso".

di utilizzare né classi né tipi della libreria standard. Secondo te/voi
Una domanda che mi nasce spontanea : da quando in qua i clienti
intervengono su come deve essere scritto un programma ?

confronti tra righe di grandi matrici rappresentate in forma compatta)
L'unica prova poteva essere un test comparativo.
Paolo

 100.  E magari un 0.5% di velocita` qui lo guadagni pure.
Si, mi paga a ore ma pretende di fare una stima prioristica. E' un tipo
di rapporto che andrebbe evitato come la peste. Ma rifiutare il lavoro č
ancora peggio, almeno per me...
Ora, il tuo messaggio č stato molto divertente ma purtroppo il discorso
rimane aperto. Io non so come convincere qualcuno che i tipi della
libreria standard sono altrettanto efficienti dei semplici array. Forse
dovrei fare un bell'esempio che lo dimostri. Hai niente da consigliarmi?
Comunque č stato interessante vedere come, invece, sono riuscito a
convincerlo (almeno credo) che le piccole ottimizzazioni che voleva che
facessi durante lo sviluppo erano inutili se non controproducenti. E
alla fine, puntualmente, il profiler (a proposito: quello del VC++ 6 mi
sembra che non sia funzionante al 100% dato che alcune funzioni non
risultavano nella lista ed erano invece chiaramente chiamate in quanto
lo erano alcune chiamate solo al loro interno) ha evidenziato come punto
critico una funzione a prima vista insospettabile.
EMG

 intervengono su come deve essere scritto un programma ?
Esistono vari tipi di clienti e vari tipi di rapporti di lavoro. Nel mio
caso il cliente è un ricercatore/programmatore che aveva bisogno di un
collaboratore per portare a termine un certo progetto. Chiaramente
questo tipo di clienti è molto più esigente in quanto il software
sviluppato lo intendono come codice sorgente in cui mettere, in seguito,
anche pesantemente le mani.
EMG

collaboratore per portare a termine un certo progetto.
Ah, allora non si tratta di clienti, ma di collaboratori ;)
E' diverso.

pagassero a peso...
Perche', quelli che cercano di convincere gli amici ad acquistare i
computer Olivetti perche' hanno saputo che la casa in questione
sottopone le macchine a delle prove di resistenza fisica (tramite
sobbalzi, urti, ecc...) ?
Giuro che e' vero.

 L'unica prova poteva essere un test comparativo.
Già, ma sarebbe stato necessario sviluppare entrambe le versioni del
software.
EMG

 critico una funzione a prima vista insospettabile.
E allora apparentemente alle misure di prestazioni questo ci
guarda, da cui i consigli di cui sopra: metti in piedi e poi
mostragli i risultati delle misure di prestazioni.
Alex

 ho approfittato per scherzarci su, per sdrammatizzare.
Scherzi? Non mi dispiaceva affatto lo scherzo, anzi. Mi dolevo soltanto
che il mio problema non era risolto. Comunque grazie dei consigli. Ci
penserò su...
EMG

 penserò su...
*Auguri*, e di cuore!!!
Alex

software.
nah... basta fare delle prove su semplificazioni di certe 
funzionalita'...
Paolo

 per la mente-ospite ("memi dis-funzionali").
Questo tuo splendido messaggio (nel quale ammiro, come normalmente
accade con tutti i tuoi, la tua profonda e variegata cultura) potrei
forse dire che, parlando dei memi, rappresenta un modo di propagarsi per
dei meta-memi?
EMG

 funzionalita'...
Mi avete fatto venire la voglia di provarci...
EMG

 wrote in message
news:390044E1...@flashnet.it...

Eh si`, il meme relativo ai memi, sorto cosi` di recente,
si sta propagando molto, molto rapidamente, e io sono di
certo un suo vettore!-)
Alex