C ++, что хуже абстрагирования или конвертации? - PullRequest
1 голос
/ 28 июля 2010

Я сомневаюсь:

Или я абстрагирую свой строковый тип и неявно использую локальный строковый тип, или я использую что-то вроде 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 в символьное кодирование того времени выполнения. Имейте в виду, строка может стать очень большой в моей реализации!

Что мне делать / выбирать?

Спасибо,

Filip

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

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

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

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

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

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

0 голосов
/ 04 августа 2010

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

0 голосов
/ 28 июля 2010

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

100MB строк.Это решает это.Используйте typedef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...