Я обнаружил, что большинство людей в этой теме не совсем понимают, что такое immutable_string
. Речь идет не только о постоянстве. Реальная сила immutable_string
- это производительность (даже в однопоточной программе) и использование памяти.
Представьте, что, если все строки являются неизменяемыми, а все строки реализованы как
class string {
char* _head ;
size_t _len ;
} ;
Как мы можем реализовать операцию sub-str? Нам не нужно копировать любой символ. Все, что нам нужно сделать, это назначить _head
и _len
. Затем подстрока разделяет тот же сегмент памяти с исходной строкой.
Конечно, мы не можем реально реализовать строку immutable_string только с двумя членами данных. Реальной реализации может потребоваться блок памяти с подсчетом ссылок (или с взвешиванием по мухе). Как это
class immutable_string {
boost::fly_weight<std::string> _s ;
char* _head ;
size_t _len ;
} ;
И память, и производительность в большинстве случаев будут лучше, чем у традиционной строки, особенно если вы знаете, что делаете.
Конечно, C ++ может извлечь выгоду из неизменяемой строки, и приятно иметь ее. Я проверил boost::const_string
и fix_str
, упомянутые Cubbi. Это должно быть то, о чем я говорю.