Newsgroup: it.comp.lang.c++
Titolo: Come dich - alloc - iniz stringa ?

Secondo voi, qual' e' il modo piu' veloce per dichiarare - allocare ed
inizializzare a NULL una stringa ovvero un vettore di chars ?
Cioe' qual' e' il modo piu' veloce di fare questa cosa qui :
char *var1;
if ( ! (var1 = new char[100]) )
    printf("Manca memoria !\n");
*var1 = '\0';
Ciao e grazie
Ste


Per fare questa domanda, i motivi possono essere due: o sei un patito
dell'ottimizzazione, oppure č una operazione che ripeti tante volte.
Immagino si tratti del secondo caso.
Nel codice che hai presentato l'operazione che perde piů tempo č la new.
Confronto ed azzeramento della stringa sono estremamente rapidi. Ci sono
varie soluzioni. Una potrebbe risiedere nel contesto del problema:
escogita un modo per evitare di allocare le stringhe. Un'altra consiste
nel sostituire la chiamata new per l'allocazione della stringa con
un'altra piů rapida fornita da qualche libreria accessoria (ad esempio,
prova a sostituire alla new la malloc del C). Se hai un software di
profiling puoi fare varie prove e controllare quanto tempo perdi con le
varie chiamate. Un'altra soluzione richiede un po' di lavoro
addizionale: progetta un meccanismo di allocazione e disallocazione
delle stringhe ad hoc, piů semplice e quindi piů efficiente del
meccanismo di allocazione standard, magari basato sull'utilizzo di un
buffer di memoria preallocato e disponibile per la memorizzazione delle
stringhe. Ricordati comunque di non complicare troppo il sistema, pena
la perdita di tutti i benefici in termini di prestazioni.
Ciao
-- 
Fabrizio Di Giuseppe
fabrizio.KILLME.@iride.com
(remove ".KILLME." from the address to send me a message)

*var1 = '\0';
Pare di capire che non hai un compilatore vicino
allo standard (se no, new non potrebbe mai tornare
zero -- se manca memoria, e` un'exception), quindi
e` difficile darti consigli precisi.  Quello che presenti
e` presumibilmente il modo piu` rapido, o giu` di li`,
che sia portabile, e se hai bisogno che l'array viva
in memoria dinamica.  Se puo` vivere sullo stack e
la portabilita` non e` un problema, vari compilatori
(gcc, Microsoft Visual C++, ecc) hanno funzioni
alloca(), _alloca(), ecc, che allocano dinamicamente
memoria *sullo stack* (quindi viva solo sino alla fine
della funzione, senza bisogno di liberarla), il che e`
molto piu` veloce che prenderla "dallo heap" come
fanno malloc o new... ma non ti serve se hai vincoli
di portabilita`, o di "tempo di vita" dell'array.
Alex

varie chiamate.
Con Visual C++ ad esempio come si fa ?
Grazie ancora.
Stefania

zero -- se manca memoria, e` un'exception)
Veramente ho visto l' esempio su di un libro (C++ - Schildt - Mc Graw Hill)
che consiglia il new rispetto al malloc e gestisce le mancate allocazioni
cosi'.
Ciao e grazie
Stefania

Con Visual C++ ad esempio come si fa ?
Vedi la guida in linea sotto "profiling" per una panoramica
delle moltissime opzioni a tua disposizione (solo nelle
versioni professional ed enterprise, pero`).
Alex

che consiglia il new rispetto al malloc e gestisce le mancate allocazioni
Gia`, questo e` il problema di studiare C++ su di un libro che
sia stato scritto piu` di 1-2 anni fa -- il linguaggio e` cambiato
troppo negli ultimi anni...!  (Schildt, poi, ha una brutta fama gia`
dai tempi in cui scriveva sull'ANSI C e mostrava in 100 modi
diversi di non avere mai neanche letto lo standard e basarsi
sulle idiosincrasie di un compilatore specifico).
Alex