Stringhe C ++ a efficienza di memoria (interning, corde, copia su scrittura, ecc.)

La mia applicazione sta avendo problemi di memoria, inclusa la copia di molte stringhe, usando le stesse stringhe delle chiavi in ​​molti hashtables, ecc. Sto cercando una class base per le mie stringhe che lo renda molto efficiente.

Sto sperando in:

  • String interning (più stringhe dello stesso valore usano la stessa memoria),
  • copy-on-write (penso che questo sia gratuito in quasi tutte le implementazioni di std :: string),
  • qualcosa con le corde sarebbe un bonus (per la concatenazione O (1) -ish).

La mia piattaforma è g ++ su Linux (ma è improbabile che importi).

Conosci una tale biblioteca?

    Se la maggior parte delle stringhe è immutabile, la libreria Boost Flyweight potrebbe soddisfare le tue esigenze.

    Farà internare la stringa, ma non credo che faccia la copia su scrittura.

    copy-on-write (penso che questo sia gratuito in quasi tutte le implementazioni di std :: string)

    Non credo che questo sia più il caso. Copy-on-write causa problemi quando si modificano le stringhe tramite iteratori: in particolare, ciò causa risultati indesiderati (ovvero nessuna copia e entrambe le stringhe vengono modificate) o un sovraccarico non necessario (poiché gli iteratori non possono essere implementati puramente in termini di puntatori : devono eseguire controlli aggiuntivi quando vengono sottoposti a dereferenziazione).

    Inoltre, tutti i moderni compilatori C ++ eseguono NRVO ed eliminano la necessità di copiare le stringhe del valore di ritorno nella maggior parte dei casi. Poiché questo è stato uno dei casi più comuni per la semantica copy-on-write, è stato rimosso a causa degli aspetti negativi di cui sopra.

    L’ implementazione di ‘ Basic Based basic_string ‘ di Andrei Alexandrescu può aiutare.

    Dai un’occhiata a The Better String Library del leggendario Paul Hsieh