Chiedo nel contesto delle prestazioni. Stringstream è semplicemente una stringa/vettore, quindi scrivere su di esso può far sì che tutto il suo contenuto venga copiato su una parte più grande della memoria, o è fatto in un modo più complesso (ad esempio, un elenco di stringhe o qualsiasi altra cosa)?Come funziona lo stringstream internamente?
risposta
Spetta al fornitore di librerie standard come implementare stringstream (o qualsiasi funzione di libreria per quella materia). Puoi vedere l'header sstream fornito con il tuo compilatore per vedere come è implementato lì. Questo sul lato teorico ...
Per quanto riguarda l'esperienza pratica e le misurazioni mostrano, ostringstream è spesso lento rispetto ad altri metodi per la formattazione dei dati come stringhe di caratteri. Ma poi di nuovo, ottimizza solo dopo aver misurato che ciò che si desidera ottimizzare è effettivamente un collo di bottiglia delle prestazioni, altrimenti sarebbe solo una perdita di tempo al meglio.
Se le tue misurazioni mostrano che le prestazioni di ostringstream sono davvero un problema per te, prendi in considerazione l'utilizzo di Boost.Karma. Ovviamente ci sono più motivi per usare Boost.Karma oltre alle prestazioni, quindi se stai iniziando un nuovo codice piuttosto che voler modificare uno esistente utilizzando i flussi di stringa, potresti voler usare Karma sin dall'inizio.
27.7.3/1 indica che basic_ostringstream
utilizza uno basic_stringbuf
. Penso che 27.7.1.3/8 affermi che lo basic_stringbuf
fa spazio riallocando un buffer e non garantisce nemmeno la crescita esponenziale (e quindi ammortizza O (1) da aggiungere).
Ma trovo la sezione flussi dello standard piuttosto impenetrabile, e c'è sempre la regola "as-if". Quindi non posso prometterti che l'uso di uno deque
sotto (e il consolidamento quando qualcuno richiede la stringa/buffer) sia effettivamente proibito.
basic_stringbuf non deve memorizzare la sua memoria in un formato contiguo, quindi quando il suo buffer è pieno, non sarà necessario riallocare (cioè spostare la memoria originale) ma potrebbe farlo funzionare come std :: deque. Dato che STL è open source, è possibile osservare come un particolare fornitore implementa basic_stringbuf. – CashCow
Anche se le implementazioni variano, in molti casi lo standard fa i requisiti generali di prestazione. Credo che sia quello che l'OP sta chiedendo. –
@ Poger Pate: Sicuramente ci sono requisiti di complessità nello standard, ma non ricordo quelli che impedirebbero l'implementazione di ostringstream usando un singolo buffer contiguo o più buffer a dimensione fissa. In effetti, personalmente non ricordo alcuna specifica di complessità per le funzioni standard di streaming di i/o. Fai? – usta