у нас есть многопоточное настольное приложение на C ++ (MFC). В настоящее время разработчики используют либо CString, либо std :: string, вероятно, в зависимости от их настроения. Поэтому мы хотели бы выбрать одну реализацию (возможно, отличную от этих двух).
CString MFC основан на идиоме копирование при записи (COW), и некоторые люди утверждают, что это недопустимо в многопоточной среде (и, вероятно, ссылка на эта статья ). Я не убежден в таких утверждениях, поскольку атомные счетчики кажутся довольно быстрыми, а также эти накладные расходы каким-то образом компенсируются сокращением перераспределения памяти.
Я узнал, что реализация std :: string зависит от компилятора - это не COW в MSVC, но он есть или был в gcc. Насколько я понял, новый стандарт C ++ 0x исправит это, потребовав реализации без COW и решив некоторые другие проблемы, такие как непрерывные требования к буферу. Так что на самом деле std :: string на данный момент выглядит не очень хорошо определенным ...
Быстрый пример того, что мне не нравится в std :: string: нет способа вернуть строку из функции без чрезмерного перераспределения (конструктор копирования при возврате по значению и отсутствие доступа к внутреннему буферу для его оптимизации) поэтому «возврат по ссылке», например, std::string& Result
не помогает). Я могу сделать это с CString, либо возвращая по значению (без копирования из-за COW), либо передавая по ссылке и получая прямой доступ к буферу. Опять же, C ++ 0x на помощь с его ссылками на rvalue, но у нас не будет C ++ 0x в ближайшей функции.
Какой класс строк мы должны использовать? Может ли COW действительно стать проблемой? Существуют ли другие часто используемые эффективные реализации строк? Спасибо.
РЕДАКТИРОВАТЬ: Мы не используем Unicode в настоящее время, и вряд ли нам это понадобится. Однако, если есть что-то легко поддерживающее юникод (не за счет ICU ...), это было бы плюсом.