У меня есть недавнее чтение о неизменных строках, Почему строки не могут быть изменяемыми в Java и.NET? и Почему Строка.NET неизменна? также некоторый материал о том, почему D выбрал неизменные строки. Кажется, существует много преимуществ.
Не говоря уже о самых новых языках имеют неизменные строки, D2.0, Java, C#, Python, и т.д.
C++ извлек бы выгоду из неизменных строк?
Действительно ли возможно реализовать неизменный строковый класс в C++ (или C++ 0x), который имел бы все эти преимущества?
обновление:
Существует две попытки неизменных строк const_string и fix_str. Ни один не был обновлен в пять лет. Они даже используются? Почему не сделал const_string, когда-нибудь превращают его в повышение?
В качестве мнения:
Стоит ли это делать (как стандартная функция библиотеки)? Я бы сказал, что нет. Использование const дает вам локально неизменяемые строки, а основная природа языков системного программирования означает, что вам действительно нужны изменяемые строки.
Я не думаю, что здесь есть окончательный ответ . Это субъективно - если не из-за личного вкуса, то хотя бы из-за типа кода, с которым чаще всего сталкиваешься. (Тем не менее, ценный вопрос.)
Неизменяемые строки хороши, когда память дешевая - это было не так, когда был разработан C ++, и это не так на всех платформах, ориентированных на C ++. (OTOH на более ограниченных платформах C кажется гораздо более распространенным, чем C ++, поэтому этот аргумент слаб.)
Вы можете создать неизменяемый строковый класс в C ++, и вы можете сделать его в значительной степени совместимым с std :: string
, но вы все равно проиграете при сравнении со встроенным строковым классом с выделенными оптимизациями и языковыми функциями.
std :: string
- лучшая стандартная строка, которую мы получаем, поэтому я бы не хотел, чтобы с ней возились. Но я использую его очень редко; std :: string
имеет слишком много недостатков с моей точки зрения .
Вы, конечно, не единственный человек, который это делает. На самом деле, есть const_string библиотека Максима Егорушкина, которая, кажется, была написана с учетом включения в буст. А вот еще немного новая библиотека, fix_str Роланда Пибингера. Я не уверен, насколько сложным будет полноценное стажировка во время выполнения, но большинство преимуществ достижимы при необходимости.
постоянные строки имеют мало смысла с семантикой значений, и совместное использование не является одной из самых сильных сторон C ++ ...
const std::string
Вот и все. Строковый литерал также неизменяем, если вы не хотите попасть в неопределенное поведение.
Редактировать: Конечно, это только половина дела. Строковая переменная типа const бесполезна, потому что вы не можете сделать так, чтобы она ссылалась на новую строку. Ссылка на константную строку сделает это, за исключением того, что C ++ не позволит вам переназначить ссылку, как в других языках, таких как Python. Ближайшим вариантом будет умный указатель на динамически выделяемую строку.
Qt также использует неизменяемые строки с копированием при записи.
Есть некоторые споры о том, какую производительность он действительно приносит с приличными компиляторами.