C++, что такое худшая абстракция далеко или преобразование?

Я вызываю сомнение:

Или я абстрагирую далеко свой строковый тип и неявно использую локальный 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

1
задан Filip 27 July 2010 в 20:03
поделиться

3 ответа

Почему размер строки является проблемой? Либо вам нужен Юникод (или по крайней мере что-то за пределами ASCII), и вы принимаете дополнительные требования к памяти требования, либо вы используете что-то типа std::string. С первого взгляда, ICU будет работать с UTF-8, хотя с небольшими дополнительными усилиями, и это идентичен ASCII, когда имеет дело с только с символами ASCII. - Дэвид Thornley

Размер строки - самая большая проблема. Представьте, у вас есть строка, которая занимает 100 МБ памяти. Выбран последний вариант, и все строки сохраняются в формате UnicodeString (icu)... Поскольку код кроссплатформенный, некоторый другой код нуждается в содержимом в своем собственном формате, скажем, NSString на Mac или System.String на платформах dotNet.

Теперь вам нужно создать временный буфер такого же размера, возможно, даже большего (UTF8 может занимать до 6 байт на символ), запустить на нем конвертер, а затем создать новую строку выбранного вами типа с содержимым этого буфера. Где-то в этом процессе вы в итоге получаете 3 строки, все одинаковые. 300+ МБ используется только потому, что строка кода хочет получить что-то в своем собственном типе... Какая потеря!

Теперь представьте, что этот код преобразования вызывается несколько раз, и, возможно, в нескольких потоках.

Разве нам не повезло, что есть 64-бит, чтобы решить все наши проблемы с памятью ;-)

2
ответ дан 2 September 2019 в 22:40
поделиться

Лично я предпочитаю typedef. Я даже не знаю почему.

Строки 100 МБ. Это решает проблему. Используйте typedef.

0
ответ дан 2 September 2019 в 22:40
поделиться

Взгляните на интерфейсы ICU UText . Они предназначены для непрерывного хранения строк.

0
ответ дан 2 September 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: