VC++ 9.0 в Release вставляет проверку при обращении к элементу вектора:
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.reserve(1);
v[0];
}
; 8 : v[0];
mov edx, DWORD PTR _v$[esp+68]
mov eax, DWORD PTR _v$[esp+64]
sub edx, eax
sar edx, 2
test edx, edx
ja SHORT $LN64@main
call DWORD PTR __imp___invalid_parameter_noinfo
mov eax, DWORD PTR _v$[esp+64]
$LN64@main:
С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
Здравствуйте, igna, Вы писали:
I>VC++ 9.0 в Release вставляет проверку при обращении к элементу вектора:
I>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
нормально согласуется (сразу ассемблер)
Это у вас release или debug
из файла <vector>
Так что глухо как в танке. Разве что перекомпилировать STL
>С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
Так же как паранойя на предмет замены strcpy на strcpy_s и т.п.
Известная фича реализации DinkumSTL для MSVC — обсуждалось множество раз в темах типа "ха ха ха — ваш стл-ный вектор гораздо медленнее нашего обычного массива"
PD>#define _SCL_SECURE_VALIDATE_RANGE(cond) \ PD> { \ PD> if (!(cond)) \ PD> { \ PD> _ASSERTE((#cond, 0)); \ PD> _SCL_SECURE_OUT_OF_RANGE_NO_ASSERT; \ PD> } \ PD> __analysis_assume(cond); \ PD> }
PD>[/ccode]
PD>Так что глухо как в танке. Разве что перекомпилировать STL >>С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется. PD>Так же как паранойя на предмет замены strcpy на strcpy_s и т.п.
а разве обычный #define _SECURE_SCL 0 вместе #define _SECURE_SCL_THROWS 0
не проканает?
Здравствуйте, igna, Вы писали:
I>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
А мне нравится.
И то, как реализовано бросание исключения: пользовательская функция в SetUnhandledExceptionFilter не учитывается.
Нет, серьёзно.
А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.
Здравствуйте, Alexander G, Вы писали:
AG>А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.
Можно. А еще можно отключить всеобщую проверку при помощи #define _SECURE_SCL 0 (http://rsdn.ru/forum/cpp/3582319.1.aspx) и использовать vector::at там, где она нужна. Как собственно и было задумано.
Здравствуйте, igna, Вы писали:
I>Можно. А еще можно отключить всеобщую проверку при помощи #define _SECURE_SCL 0 (http://rsdn.ru/forum/cpp/3582319.1.aspx) и использовать vector::at там, где она нужна. Как собственно и было задумано.
at неудобен, он кидает наследника std::excpetion, а не приводит к немедленному крэшу. И алгоритмы не будут использовать at.
Да и при использовании #define _SECURE_SCL 0 не забудьте собрать буст и всё остальное с этой же опцией. Иначе будет один из интеных случаев нарушения ODR.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, igna, Вы писали:
I>>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
AG>А мне нравится. AG>И то, как реализовано бросание исключения: пользовательская функция в SetUnhandledExceptionFilter не учитывается. AG>Нет, серьёзно.
AG>А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.
Ну тогда уж можно и контейнер свой написать, который можно будет настраивать всеми мыслимыми способами.
Здравствуйте, igna, Вы писали:
I>Можно. А еще можно отключить всеобщую проверку при помощи #define _SECURE_SCL 0 (http://rsdn.ru/forum/cpp/3582319.1.aspx) и использовать vector::at там, где она нужна. Как собственно и было задумано.
Большое количество проблем с переносимостью уходит если таскать стл с собой.
Макросы пробовать не советую — напоретесь на 3rd party binary и все будет мистически глючить.