Отключение проверки границ векторы C++

С stl:: вектор:

vector<int> v(1);
v[0]=1; // No bounds checking
v.at(0)=1; // Bounds checking

Есть ли способ отключить проверку границ, не имея необходимость переписывать все at() как []? Я пользуюсь Библиотекой C++ Стандарта GNU.

Править: Я изменился at() к [] в области, где я подозревал узкое место, и оно значительно уменьшило время вычисления. Однако, так как я выполняю итерации между разработкой кода и выполнением экспериментов с ним, я хотел бы включить проверку границ во время разработки и отключить ее, когда я выполняю эксперименты для реального. Я предполагаю, что совет Andrew является лучшим решением.

11
задан R Samuel Klatchko 5 March 2010 в 08:02
поделиться

7 ответов

Если вы действительно хотите это сделать (хотя бы для быстрого и грязного сравнения профилирования), это будет работать, если у вас нет других at()s

#define at(x) operator[](x)

А если вы хотите оставить at() для разработки и использовать operator[] в production, просто оберните его в #ifdef.

И если у вас есть другие at(), вы всегда можете отредактировать ваш #included файл.

24
ответ дан 3 December 2019 в 00:49
поделиться

На основании вашего комментария о том, что вы хотели бы включить / выключить проверку границ, вы можете использовать функцию шаблона оболочки:

template <class T>
inline typename T::reference deref(T &cont, typename T::size_type idx)
{
#if BOUNDS_CHECK
    return cont.at(idx);
#else
    return cont[idx];
#endif
}

template <class T>
inline typename T::const_reference deref(const T &cont, typename T::size_type idx)
{
#if BOUNDS_CHECK
    return cont.at(idx);
#else
    return cont[idx];
#endif
}

Для включения этого вам придется изменить свой код, но как только вы его установили, вы можете включить или отключить проверку привязки по своему усмотрению.

Я признаю, что использовать это выглядит немного некрасиво:

deref(vec, 10) = ...;
5
ответ дан 3 December 2019 в 00:49
поделиться

Создайте свой собственный класс vector в своем собственном пространстве имен, например "uncheckedvector", и переопределите at() базового типа vector, чтобы использовать индекс массива.

Тогда использование "using uncheckedvector::vector" позволит вам переопределить все ваши использования вектора везде. Однако это не сработает, если вы используете полностью квалифицированные типы.

2
ответ дан 3 December 2019 в 00:49
поделиться

Если у вас есть достаточно согласованные шаблоны доступа (т.е. / не произвольный доступ), вместо использования at () или [], один из способов избежать проверки диапазона - использовать итераторы, используя begin () , end () и advance () или даже лучше, используя стандартные алгоритмы.

Хотя это не решает основную проблему исправления at () выполнение проверки диапазона, некоторые реализации стандартной библиотеки (MSVC) проверили итераторы для некоторых типов сборок

{{1} }
0
ответ дан 3 December 2019 в 00:49
поделиться

Возможно, лучшим решением будет использование [] и использование проверенной реализации стандартной библиотеки для отладки.

6
ответ дан 3 December 2019 в 00:49
поделиться

Нет. Проверка границ std :: vector :: at определена стандартом, и не существует соответствующей стандарту реализации C ++, которая могла бы отклоняться от этого.

15
ответ дан 3 December 2019 в 00:49
поделиться

Не стандартный способ. Вы можете отключить исключения в своем компиляторе. Вы можете сделать это с помощью gcc с -fno-exceptions .

Однако вам следует опасаться этого; ваши библиотеки (включая стандартные библиотеки) могут плохо работать с отключенными исключениями. Проверьте свою документацию и темы вроде в списке рассылки gcc .

3
ответ дан 3 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

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