abbiamo un'applicazione desktop multithread in C++ (MFC). Attualmente gli sviluppatori usano CString o std :: string, probabilmente a seconda del loro umore. Quindi vorremmo scegliere una singola implementazione (probabilmente qualcosa di diverso da questi due).Quali classi stringa usare in C++?
CString di MFC si basa sull'idioma copy-on-write (COW) e alcune persone ritengono che ciò sia inaccettabile in un ambiente con multithreading (e probabilmente riferimento a this article). Non sono convinto da tali affermazioni, poiché i contatori atomici sembrano essere abbastanza veloci, e anche questo sovraccarico è in qualche modo compensato da una riduzione delle ridistribuzioni della memoria.
Ho imparato che l'implementazione di std :: string dipende dal compilatore - non è COW in MSVC ma è, o era in gcc. Per quanto ho capito, il nuovo standard C++ 0x risolverà questo problema richiedendo un'implementazione non COW e risolvendo alcuni altri problemi, come i requisiti di buffer contigui. Quindi in effetti std :: string sembra non ben definito a questo punto ...
Un rapido esempio di ciò che non mi piace di std :: string: impossibile restituire una stringa da una funzione senza ridistribuzioni eccessive (copia costruttore se restituisce per valore, e nessun accesso al buffer interno per ottimizzarlo così "ritorno per riferimento" es. std::string& Result
non aiuta). Posso farlo con CString restituendo per valore (nessuna copia dovuta a COW) o passando per riferimento e accedendo direttamente al buffer. Ancora una volta, C++ 0x in soccorso con i suoi riferimenti rvalue, ma non avremo C++ 0x nella funzione più vicina.
Quale classe di stringa dovremmo utilizzare? La COW può davvero diventare un problema? Esistono altre implementazioni efficienti comunemente utilizzate delle stringhe? Grazie.
MODIFICA: Al momento non utilizziamo unicode ed è improbabile che ne avremo bisogno. Tuttavia, se c'è qualcosa che supporta facilmente unicode (non a costo di ICU ...), sarebbe un vantaggio.
La maggior parte delle persone supporrà che non sia UNICODE. È giusto? –
@baris_a: grazie, lo renderò più chiaro –
Sei a conoscenza di [RVO] (http://en.wikipedia.org/wiki/Return_value_optimization)? Ciò potrebbe placare alcune delle tue preoccupazioni sulle stringhe come valori di ritorno. Si potrebbe anche voler leggere [Vuoi velocità? Passa per valore.] (Http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/) –