неизменные строки по сравнению со станд.:: строка

У меня есть недавнее чтение о неизменных строках, Почему строки не могут быть изменяемыми в Java и.NET? и Почему Строка.NET неизменна? также некоторый материал о том, почему D выбрал неизменные строки. Кажется, существует много преимуществ.

  • тривиально ориентированный на многопотоковое исполнение
  • более безопасный
  • больше памяти, эффективной в большинстве вариантов использования.
  • дешевые подстроки (маркирование и разрезание)

Не говоря уже о самых новых языках имеют неизменные строки, D2.0, Java, C#, Python, и т.д.

C++ извлек бы выгоду из неизменных строк?

Действительно ли возможно реализовать неизменный строковый класс в C++ (или C++ 0x), который имел бы все эти преимущества?


обновление:

Существует две попытки неизменных строк const_string и fix_str. Ни один не был обновлен в пять лет. Они даже используются? Почему не сделал const_string, когда-нибудь превращают его в повышение?

61
задан reevesy 6 January 2019 в 13:24
поделиться

6 ответов

В качестве мнения:

  • Да, мне очень нужна неизменяемая строковая библиотека для C ++.
  • Нет, я бы не хотел, чтобы std :: string был неизменным.

Стоит ли это делать (как стандартная функция библиотеки)? Я бы сказал, что нет. Использование const дает вам локально неизменяемые строки, а основная природа языков системного программирования означает, что вам действительно нужны изменяемые строки.

23
ответ дан 24 November 2019 в 17:22
поделиться

Я не думаю, что здесь есть окончательный ответ . Это субъективно - если не из-за личного вкуса, то хотя бы из-за типа кода, с которым чаще всего сталкиваешься. (Тем не менее, ценный вопрос.)

Неизменяемые строки хороши, когда память дешевая - это было не так, когда был разработан C ++, и это не так на всех платформах, ориентированных на C ++. (OTOH на более ограниченных платформах C кажется гораздо более распространенным, чем C ++, поэтому этот аргумент слаб.)

Вы можете создать неизменяемый строковый класс в C ++, и вы можете сделать его в значительной степени совместимым с std :: string , но вы все равно проиграете при сравнении со встроенным строковым классом с выделенными оптимизациями и языковыми функциями.

std :: string - лучшая стандартная строка, которую мы получаем, поэтому я бы не хотел, чтобы с ней возились. Но я использую его очень редко; std :: string имеет слишком много недостатков с моей точки зрения .

3
ответ дан 24 November 2019 в 17:22
поделиться

Вы, конечно, не единственный человек, который это делает. На самом деле, есть const_string библиотека Максима Егорушкина, которая, кажется, была написана с учетом включения в буст. А вот еще немного новая библиотека, fix_str Роланда Пибингера. Я не уверен, насколько сложным будет полноценное стажировка во время выполнения, но большинство преимуществ достижимы при необходимости.

3
ответ дан 24 November 2019 в 17:22
поделиться

постоянные строки имеют мало смысла с семантикой значений, и совместное использование не является одной из самых сильных сторон C ++ ...

0
ответ дан 24 November 2019 в 17:22
поделиться
const std::string

Вот и все. Строковый литерал также неизменяем, если вы не хотите попасть в неопределенное поведение.

Редактировать: Конечно, это только половина дела. Строковая переменная типа const бесполезна, потому что вы не можете сделать так, чтобы она ссылалась на новую строку. Ссылка на константную строку сделает это, за исключением того, что C ++ не позволит вам переназначить ссылку, как в других языках, таких как Python. Ближайшим вариантом будет умный указатель на динамически выделяемую строку.

2
ответ дан 24 November 2019 в 17:22
поделиться

Qt также использует неизменяемые строки с копированием при записи.
Есть некоторые споры о том, какую производительность он действительно приносит с приличными компиляторами.

0
ответ дан 24 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: