Я вызываю сомнение:
Или я абстрагирую далеко свой строковый тип и неявно использую локальный stringtype, или я использую что-то как ICU и преобразовываю в локальный тип при необходимости.
Позвольте мне дать Вам пример следующее:
enum StringKind {
ICU_STRING,
STD_STRING,
MSCORLIB_STRING,
NSSTRING,
... /* You get the picture */
};
template<class E>
class _MyString {
};
template<>
class _MyString<ICU_STRING> {};
template<>
class _MyString<NSSTRING> {};
#if defined(__ICU_INSTALLED__)
typedef _MyString<ICU_STRING> MyString;
#elif defined(__DOT_NET__)
typedef _MyString<MSCORLIB_STRING> MyString;
/* ... */
#endif
или я просто использую реализацию ICU в своем коде и преобразовываю UnicodeString в characterencoding того времени выполнения. Знайте, строка может стать очень большой в моей реализации!
Что я должен/выбрать?
Спасибо,
Filip
Почему размер строки является проблемой? Либо вам нужен Юникод (или по крайней мере что-то за пределами ASCII), и вы принимаете дополнительные требования к памяти требования, либо вы используете что-то типа std::string. С первого взгляда, ICU будет работать с UTF-8, хотя с небольшими дополнительными усилиями, и это идентичен ASCII, когда имеет дело с только с символами ASCII. - Дэвид Thornley
Размер строки - самая большая проблема. Представьте, у вас есть строка, которая занимает 100 МБ памяти. Выбран последний вариант, и все строки сохраняются в формате UnicodeString (icu)... Поскольку код кроссплатформенный, некоторый другой код нуждается в содержимом в своем собственном формате, скажем, NSString на Mac или System.String на платформах dotNet.
Теперь вам нужно создать временный буфер такого же размера, возможно, даже большего (UTF8 может занимать до 6 байт на символ), запустить на нем конвертер, а затем создать новую строку выбранного вами типа с содержимым этого буфера. Где-то в этом процессе вы в итоге получаете 3 строки, все одинаковые. 300+ МБ используется только потому, что строка кода хочет получить что-то в своем собственном типе... Какая потеря!
Теперь представьте, что этот код преобразования вызывается несколько раз, и, возможно, в нескольких потоках.
Разве нам не повезло, что есть 64-бит, чтобы решить все наши проблемы с памятью ;-)
Лично я предпочитаю typedef. Я даже не знаю почему.
Строки 100 МБ. Это решает проблему. Используйте typedef.
Взгляните на интерфейсы ICU UText . Они предназначены для непрерывного хранения строк.