2009-12-21 5 views
16

Uso estesamente std::stringstream per costruire stringhe e messaggi di errore nella mia applicazione. Le stringstreams sono in genere variabili automatiche a vita molto breve.Devo preallocare std :: stringstream?

Tale utilizzo causerà la riallocazione dell'heap per ogni variabile? Devo passare dalla variabile temporanea alla classe stringstream?

In quest'ultimo caso, come è possibile prenotare il buffer stringstream? (Devo inizializzarlo con una stringa abbastanza grande o c'è un metodo più elegante?)

risposta

11

Hai profilato la tua esecuzione, e li hai trovati fonte di rallentamento?

Considerare il loro utilizzo. Sono per lo più per i messaggi di errore al di fuori del normale flusso del codice?

Per quanto riguarda riservare uno spazio ...

Alcune implementazioni probabilmente riservano un piccolo tampone prima di qualsiasi assegnazione avvenga per lo stringstream. Molte implementazioni di std :: string fanno questo.

Un'altra opzione potrebbe essere (non testato!)

std::string str; 
str.reserve(50); 
std::stringstream sstr(str); 

Si potrebbe trovare qualche idea in più in questo gamedev thread.

edit:

gingillarsi con l'stringstream's rdbuf potrebbe anche essere una soluzione. Questo approccio è probabilmente molto facile da ottenere, quindi per favore be sure it's absolutely necessary. Sicuramente non elegante o conciso.

+0

Buon consiglio; tuttavia, riservare 50 e quindi copiare quella stringa potrebbe invece vanificare una piccola ottimizzazione del buffer non heap (se l'implementazione ne ha una). Se vuoi scrivere il tuo streambuf, allora hai un controllo preciso su tutta la gestione del buffer; dovresti usare ostream (o istream o iostream, ma la domanda indica che la formattazione dell'output è la preoccupazione qui) con lo streambuf piuttosto che cambiare il buffer di uno stringstream attraverso rdbuf. –

+6

Non penso che lo stringstream riservi qualcosa di più della lunghezza del contenuto di 'str' (che è 0). Secondo cplusplus.com: "Costruisce un oggetto ostringstream con una copia di str come contenuto.". Il riferimento è "copia del contenuto di stringhe". Non dice esplicitamente che riserva la stessa quantità di memoria. Non sono riuscito a trovare alcuna fonte che dica qualcosa sulla prenotazione della memoria usando questo costruttore. – NickSoft

+0

Il costruttore che usi sopra non è più valido. Puoi vedere che il costruttore no-copy è stato rimosso. http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069

1

Non sono sicuro, ma ho il sospetto che il numero stringbuf di stringstream sia strettamente correlato al risultato string. Pertanto, sospetto che sia possibile utilizzare ss.seekp(reserved-1); ss.put('\0'); per prenotare la quantità di byte reserved all'interno del sottostante string di ss. In realtà mi piacerebbe vedere qualcosa come ss.seekp(reserved); ss.trunc();, ma non esiste il metodo trunc() per i flussi.