Должен ли я написать свои собственные структуры данных, чтобы иметь дело с семантическим разрешением или использованием STL непосредственно в проекте компилятора - PullRequest
1 голос
/ 09 августа 2011

Я обнаружил, что STL очень тяжело использовать, например, vector, string и т. Д.Как проект компилятора, скорость и память имеют значение.Так что, если я возьму строку в качестве основной структуры данных, трудно будет улучшить скорость перевода.

Мне интересно, каково ваше решение для обработки строк в вашем проекте?

спасибо!

Ответы [ 4 ]

3 голосов
/ 09 августа 2011

При правильном использовании STL обычно ноль служебных данных.Он так же эффективен, как и свернутый вручную код C, поэтому нет причин избегать его по соображениям производительности.

Однако если вам нужна функциональность, которой нет в STL, то да, вы, вероятно,лучше написать свой собственный, чем пытаться заставить класс STL сделать что-то, для чего он не предназначен.

есть много имен, ищущих в моем проекте, например,как "com.google.voice ....", если я использую std :: string, он должен быть нарезан снова и снова.Во-первых, головной узел "com" нарезается, если объект "com" был найден, другие имена "google.voice ...." следует искать в этом объекте рекурсивно.Есть ли лучшее решение, чтобы избежать повторения строки среза?

Я бы использовал итераторы.

Скажем, у вас есть строка s = "com.google.voice", затем просто определите итераторы, указывающие на началострока и разделитель между каждой подстрокой.Затем вместо создания совершенно новой строки для представления "com", вы просто используете два итератора, указывающие на начало и конец строки.

Boost.StringAlgo содержит множество общих строковых операций, реализованных для работына диапазонах итераторов.

2 голосов
/ 09 августа 2011

Да, есть вещи, которые нужно получить, если вы делаете что-то сами.
Однако есть вещи, на которые следует обратить внимание:

  • Знаете ли вы достаточно о том, почему ваше решение будет лучше, чемстандартное решение?
  • Знаете ли вы достаточно о своей платформе, чтобы воспользоваться ее преимуществами?
  • Хотите ли вы тратить время на поиск лучших решений?
  • Хотите ли вы воспользоватьсяриск (отладка, без поддержки, ...)?
  • Откуда вы знаете, что вы получили / потеряли?

Удачи.

1 голос
/ 09 августа 2011

Я бы порекомендовал изучить пользовательские распределители для STL, если у вас возникнут какие-либо проблемы с памятью / производительностью (что вряд ли произойдет в первую очередь, как упоминал DeadMG). Я лично использую STL с пользовательскими распределителями памяти, которые снова используют мой собственный менеджер памяти (чтобы я мог отслеживать память, используемую контейнерами / строками stl, которые я использую). Поэтому, если вас беспокоит использование / фрагментация памяти, я бы порекомендовал рассмотреть возможность предоставления пользовательских распределителей для вашего кода stl.

Это был отличный ресурс, с которого я мог начать с пользовательского выделения памяти для STL: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

Я также помню, что в ogre3D есть несколько пользовательских распределителей для контейнеров STL, которые могут стать отличным примером для начала!

1 голос
/ 09 августа 2011

Вы не найдете более быстрого решения для эквивалентного алгоритма. Помимо улучшения использования строковых элементов, таких как Reserve (), правильной замены вместо копирования и т. Д., Вы не получите существенного ускорения, если у вас нет STL, которому уже десять лет или что-то в этом роде.

...