Несмотря на критику, я думаю, что это правильный вопрос.
std::string
не является панацеей. Похоже, кто-то взял класс из чистого OO и выгрузил его в C ++, что, вероятно, и так.
Совет 1: Предпочитайте методы, не являющиеся членами, не являющимися друзьями
Теперь, когда это сказано, в этот час интернационализации, я бы определенно посоветовал вам разработать класс, который бы поддерживал Unicode
. И я говорю Unicode
, а не UTF-8
или UTF-16
. Я думаю, что неуместно разрабатывать класс, который будет содержать данные в заданной кодировке. Вы можете предоставить методы для вывода информации в различных форматах.
Совет 2: Поддержка Unicode
Тогда на схемах выделения памяти есть ряд точек:
- Оптимизация небольших строк: класс содержит предварительно выделенное пространство для нескольких символов (дюжины или двух) и, таким образом, избегает выделения кучи для этих
- Копировать при записи: различные строки совместно используют буфер, поэтому копирование обходится дешево, когда одна строка должна изменить свое содержимое, она копирует буфер, если она не является единственным владельцем -> проблема в том, что многопоточность приводит к дополнительным затратам здесь и было показано, что для техники общего назначения эти накладные расходы могут превзойти фактическую стоимость копирования
- Неизменяемость: «новые» языки, такие как
Java
, C#
или Python
, используют неизменяемые строки. Думайте об этом как о пуле строк, все строки, содержащие «Fooo», будут указывать на один и тот же буфер. Обратите внимание, что эти языки поддерживают сборку мусора, что очень помогает.
Я бы лично выбрал здесь «Оптимизацию небольших строк» (хотя она не исключительна для двух других) просто потому, что она проста в реализации и должна приносить вам пользу (стоимость выделения кучи, проблемы с ссылками).
Две другие техники несколько сложны в условиях многопоточности, и они, вероятно, подвержены ошибкам и вряд ли принесут реальную выгоду, если не будут тщательно обработаны.
И вот мой последний совет:
Совет 3: Не реализовывайте внутреннюю блокировку при попытке поддержки многопоточности
Это замедлит класс при использовании в контексте SingleThreaded и не принесет столько пользы, сколько вы думаете при использовании в многопоточном.
Наконец, вы можете найти что-то, отвечающее вашим вкусам (или получить несколько указателей), просматривая существующий код. Я не обещаю показывать "гладкие" интерфейсы, хотя:
- ICU UnicodeString : поддержка Unicode, по крайней мере
- std :: string : более 100 методов-членов (с учетом различных перегрузок)
- llvm StringRef : обратите внимание, сколько алгоритмов реализовано как методы-члены: '(