у нас есть многопоточное настольное приложение на С++ (MFC). В настоящее время разработчики используют либо CString, либо std::string, возможно, в зависимости от их настроения. Таким образом, мы хотели бы выбрать одну реализацию (возможно, что-то другое, чем эти два).
MFC CString основана на idiom copy-on-write (COW), и некоторые люди утверждают, что это неприемлемо в многопоточной среде (и, вероятно, ссылается на эта статья). Я не убеждаюсь в таких утверждениях, поскольку атомные счетчики кажутся довольно быстрыми, а также эти накладные расходы каким-то образом компенсируются сокращением перераспределения памяти.
Я узнал, что реализация std::string зависит от компилятора - это не COW в MSVC, но она есть или была в gcc. Насколько я понял, новый стандарт С++ 0x исправит это, потребовав реализацию не-COW и устранив некоторые другие проблемы, такие как смежные требования к буферам. Так что на самом деле std::string выглядит недостаточно четко в этой точке...
Быстрый пример того, что мне не нравится в std::string: нет способа вернуть строку из функции без чрезмерных перераспределений (конструктор копирования, если возвращает значение по значению, и нет доступа к внутреннему буфере для оптимизации этого "возврат по ссылке", например std::string& Result
не помогает). Я могу сделать это с помощью CString либо путем возврата по значению (без копирования из-за COW), либо путем передачи по ссылке и прямого доступа к буфере. Опять же, С++ 0x на помощь с его ссылками на rvalue, но мы не собираемся иметь С++ 0x в ближайшей функции.
Какой класс строк мы должны использовать? Может ли COW действительно стать проблемой? Существуют ли другие широко используемые эффективные реализации строк? Спасибо.
EDIT: Мы не используем unicode на данный момент, и маловероятно, что нам это понадобится. Однако, если есть что-то легко поддерживающее юникод (не ценой ICU...), это будет плюсом.