Выборочное отключение проверенных итераторов - PullRequest
8 голосов
/ 21 июня 2011

Я пишу довольно сложное приложение, которое интенсивно использует контейнеры STL.Приложение имеет один, относительно простой, чувствительный к производительности раздел, который повторяется в течение нескольких std::map с и выполняется тысячи раз.Тестирование показало, что компиляция с отключенными проверенными итераторами (_SECURE_SCL, установленными в 0) приводит к почти двукратному ускорению работы программы в целом, полностью сосредоточенной в этом разделе.

Однако я не могу скомпилировать приложение с _SECURE_SCL, установленным в 0, потому что необходимо связать библиотеки, которые были скомпилированы с включенным _SECURE_SCL, и смешивание настроек _SECURE_SCL приводит к проблемам.Кроме того, я считаю довольно глупым использовать непроверенные итераторы во всем приложении, когда все биты, чувствительные к производительности, происходят в одном скрине кода.Это было бы равносильно выбрасыванию ребенка в ванну с водой.

Какие варианты у меня есть, чтобы выборочно использовать непроверенные итераторы для чувствительного к производительности кода / контейнеров при сохранении совместимости с библиотеками, скомпилированными с проверенными итераторами?

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Как вы уже узнали, вы не можете смешивать код, который использует проверенные / непроверенные итераторы, поэтому для использования его в части вашего кода вам нужно предоставить этой части интерфейс, который не требует прохождения каких-либо контейнерови итераторы.(Обратите внимание, что это распространяется на std::string.)
И, конечно, вам придется поместить этот код в его собственный исполняемый файл (DLL).Конечно, это требует, чтобы не было слишком много вызовов назад и вперед через этот API.

Чтобы быть в безопасности, я бы даже подумал поместить эту часть в DLL с интерфейсом C.

4 голосов
/ 12 октября 2011

Это работает для меня:

vector<BYTE> v;
vector<BYTE>::iterator i;
vector<BYTE>::iterator::_Unchecked_type ui;

i = v.end();
ui = i._Unchecked();

ui++;
...