Для строковых литералов и только для строковых констант, которые исходят из литералов, я бы использовал const char[]
. Основным преимуществом std::string
является то, что он имеет управление памятью бесплатно, но это не проблема с строковыми литералами.
Это фактический тип литерала в любом случае, и его можно использовать непосредственно в любом API, который требует либо старых строк с нулевым завершающим строком, либо строк C++ (неявное преобразование). Вы также получаете реализацию размера времени компиляции, используя массив вместо указателя.
Теперь при определении функциональных интерфейсов, и даже если константы намерены пройти, я предпочел бы std::string
, а не const char*
, так как в последнем случае размер теряется и, возможно, потребуется пересчитать.
Из моего собственного опыта. Я устал от написания .c_str()
на каждом вызове библиотеки протоколирования (использующей переменные аргументы) для литеральных строк с сообщениями об ошибках.
И быстрее во многих реализациях STL благодаря копированию на механизм записи, если вы используете одни и те же строки во многих разных местах, что также упрощает их использование, чем простые строки C. Помимо этого, если вам нужно поддерживать многие языки, я предпочел бы использовать std :: wstring. – jdehaan
@jdehaan: Я был бы удивлен, если бы были (m) любые реализации библиотеки std (а не STL-реализации, поскольку 'std :: string' не был частью STL), которые до сих пор делают COW. В средах МТ это обычно превращается в пессимизацию. Я думаю, что небольшая оптимизация строк (небольшие строки не выделены в куче, а в стеке) - это то, что обычно нравится сейчас. – sbi
Копирование на запись удаляется (если все еще присутствует) в большинстве реализаций. У этого есть проблемы в многопоточных средах, поскольку некоторые операции, которые кажутся потокобезопасными с точки зрения пользователя (они относятся к различным std :: string), могут быть небезопасными потоками. Рассмотрим, что строка копируется с каждой копией, переданной на разные потоки для изменения. Каждый поток имеет свою собственную строку, не имеет общих объектов, но на самом деле во внутренней реализации «copy-on-write» может быть состояние гонки. Добавление механизма блокировки в библиотеку во многих случаях приводит его к более медленному, чем простая реализация. –