Como o stringstream funciona internamente?

Eu estou perguntando no contexto de desempenho. Stringstream é simplesmente uma string / vetor, então escrever nele pode resultar em todo o seu conteúdo ser copiado para um pedaço maior de memory, ou é feito de uma maneira mais complicada (digamos, uma lista de strings ou qualquer outra coisa)?

Cabe ao fornecedor da biblioteca padrão implementar stringsstream (ou qualquer outro recurso de biblioteca). Você pode olhar para o header sstream enviado com seu compilador para ver como ele é implementado lá. Isso muito do lado teórico …

Na medida em que a experiência prática e as medições mostram, o ostringstream costuma ser lento comparado a outros methods de formatação de dados como cadeias de caracteres. Mas, novamente, apenas otimize depois de ter medido que o que você deseja otimizar é realmente um gargalo de desempenho, caso contrário, isso será apenas um desperdício de tempo na melhor das hipóteses.

Se as suas medições mostrarem que o desempenho do ostringstream é realmente um problema para você, considere o uso do Boost.Karma . É claro que há mais razões para usar o Boost.Karma do que apenas o desempenho, portanto, se você está iniciando um novo código em vez de modificar um já existente usando streams de string, você pode querer usar o Karma desde o início.

27.7.3 / 1 diz que basic_ostringstream usa um basic_stringbuf . Eu acho que 27.7.1.3/8 diz que o basic_stringbuf faz espaço realocando um buffer, e nem mesmo garante crescimento exponencial (e, portanto, O (1) amortizado para append).

Mas eu acho a seção streams do padrão bastante impenetrável, e sempre há a regra “como se”. Então eu não posso te prometer que usar um deque embaixo (e consolidar quando alguém pede a string / buffer) é realmente proibido.