С stl:: вектор:
vector<int> v(1);
v[0]=1; // No bounds checking
v.at(0)=1; // Bounds checking
Есть ли способ отключить проверку границ, не имея необходимость переписывать все at()
как []
? Я пользуюсь Библиотекой C++ Стандарта GNU.
Править: Я изменился at()
к []
в области, где я подозревал узкое место, и оно значительно уменьшило время вычисления. Однако, так как я выполняю итерации между разработкой кода и выполнением экспериментов с ним, я хотел бы включить проверку границ во время разработки и отключить ее, когда я выполняю эксперименты для реального. Я предполагаю, что совет Andrew является лучшим решением.
Если вы действительно хотите это сделать (хотя бы для быстрого и грязного сравнения профилирования), это будет работать, если у вас нет других at()
s
#define at(x) operator[](x)
А если вы хотите оставить at()
для разработки и использовать operator[]
в production, просто оберните его в #ifdef
.
И если у вас есть другие at()
, вы всегда можете отредактировать ваш #include
d
файл.
На основании вашего комментария о том, что вы хотели бы включить / выключить проверку границ, вы можете использовать функцию шаблона оболочки:
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) = ...;
Создайте свой собственный класс vector в своем собственном пространстве имен, например "uncheckedvector", и переопределите at() базового типа vector, чтобы использовать индекс массива.
Тогда использование "using uncheckedvector::vector" позволит вам переопределить все ваши использования вектора везде. Однако это не сработает, если вы используете полностью квалифицированные типы.
Если у вас есть достаточно согласованные шаблоны доступа (т.е. / не произвольный доступ), вместо использования at ()
или []
, один из способов избежать проверки диапазона - использовать итераторы, используя begin ()
, end ()
и advance ()
или даже лучше, используя стандартные алгоритмы.
Хотя это не решает основную проблему исправления at ()
выполнение проверки диапазона, некоторые реализации стандартной библиотеки (MSVC) проверили итераторы для некоторых типов сборок
Возможно, лучшим решением будет использование []
и использование проверенной реализации стандартной библиотеки для отладки.
Нет. Проверка границ std :: vector :: at
определена стандартом, и не существует соответствующей стандарту реализации C ++, которая могла бы отклоняться от этого.
Не стандартный способ. Вы можете отключить исключения в своем компиляторе. Вы можете сделать это с помощью gcc с -fno-exceptions
.
Однако вам следует опасаться этого; ваши библиотеки (включая стандартные библиотеки) могут плохо работать с отключенными исключениями. Проверьте свою документацию и темы вроде в списке рассылки gcc .