vector::operator[], runtime check?
От: igna Россия  
Дата: 27.10.09 04:56
Оценка: 9 (1)
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:


С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.
Re: vector::operator[], runtime check?
От: ioni Россия  
Дата: 27.10.09 05:27
Оценка:
Здравствуйте, igna, Вы писали:

I>VC++ 9.0 в Release вставляет проверку при обращении к элементу вектора:


I>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.


нормально согласуется (сразу ассемблер)
Это у вас release или debug
из файла <vector>

    const_reference operator[](size_type _Pos) const
        {    // subscript nonmutable sequence

 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());

        return (*(_Myfirst + _Pos));
        }
Re: vector::operator[], runtime check?
От: Pavel Dvorkin Россия  
Дата: 27.10.09 05:48
Оценка: +1
Здравствуйте, igna, Вы писали:

I>VC++ 9.0 в Release вставляет проверку при обращении к элементу вектора:


I>
I>#include <vector>
I>using namespace std;

I>int main()
I>{
I>    vector<int> v;
I>    v.reserve(1);
I>    v[0];
I>}
I>


I>
I>; 8    :     v[0];

I>    mov    edx, DWORD PTR _v$[esp+68]
I>    mov    eax, DWORD PTR _v$[esp+64]
I>    sub    edx, eax
I>    sar    edx, 2
I>    test    edx, edx
I>    ja    SHORT $LN64@main
I>    call    DWORD PTR __imp___invalid_parameter_noinfo
I>    mov    eax, DWORD PTR _v$[esp+64]
I>$LN64@main:
I>


I>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует.



reference operator[](size_type _Pos)
        {    // subscript mutable sequence

 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
        return (*(_Myfirst + _Pos));
        }



#define _SCL_SECURE_VALIDATE_RANGE(cond)                \
    {                                                    \
        if (!(cond))                                    \
        {                                                \
            _ASSERTE((#cond, 0));                        \
            _SCL_SECURE_OUT_OF_RANGE_NO_ASSERT;            \
        }                                                \
        __analysis_assume(cond);                        \
    }


Так что глухо как в танке. Разве что перекомпилировать STL

>С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.


Так же как паранойя на предмет замены strcpy на strcpy_s и т.п.
With best regards
Pavel Dvorkin
Re: vector::operator[], runtime check?
От: Bell Россия  
Дата: 27.10.09 05:58
Оценка: 2 (2) +1
Здравствуйте, igna, Вы писали:

Известная фича реализации DinkumSTL для MSVC — обсуждалось множество раз в темах типа "ха ха ха — ваш стл-ный вектор гораздо медленнее нашего обычного массива"
Любите книгу — источник знаний (с) М.Горький
Re[2]: vector::operator[], runtime check?
От: ioni Россия  
Дата: 27.10.09 06:01
Оценка: 29 (3)
Здравствуйте, Pavel Dvorkin, Вы писали:


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
не проканает?
Re[3]: vector::operator[], runtime check?
От: ioni Россия  
Дата: 27.10.09 06:09
Оценка:
Здравствуйте, ioni, Вы писали:

I>а разве обычный #define _SECURE_SCL 0 вместе #define _SECURE_SCL_THROWS 0

I>не проканает?

    vector<int> v;
01021069  xor         eax,eax 
0102106B  mov         dword ptr [esp+8],eax 
0102106F  mov         dword ptr [esp+0Ch],eax 
01021073  mov         dword ptr [esp+10h],eax 
    v.reserve(1);
01021077  lea         ecx,[esp+4] 
0102107B  mov         dword ptr [esp+20h],eax 
0102107F  call        std::vector<int,std::allocator<int> >::reserve (10210E0h) 
    v[0] = 1;
01021084  mov         eax,dword ptr [esp+8] 

    return 0;
Re[3]: vector::operator[], runtime check?
От: Pavel Dvorkin Россия  
Дата: 27.10.09 07:01
Оценка:
Здравствуйте, ioni, Вы писали:

I>а разве обычный #define _SECURE_SCL 0 вместе #define _SECURE_SCL_THROWS 0

I>не проканает?

Да, верно.
With best regards
Pavel Dvorkin
Re: vector::operator[], runtime check?
От: Alexander G Украина  
Дата: 27.10.09 11:22
Оценка:
Здравствуйте, igna, Вы писали:

I>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.


А мне нравится.
И то, как реализовано бросание исключения: пользовательская функция в SetUnhandledExceptionFilter не учитывается.
Нет, серьёзно.

А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.
Русский военный корабль идёт ко дну!
Re[2]: vector::operator[], runtime check?
От: igna Россия  
Дата: 27.10.09 15:09
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.


Можно. А еще можно отключить всеобщую проверку при помощи #define _SECURE_SCL 0 (http://rsdn.ru/forum/cpp/3582319.1.aspx) и использовать vector::at там, где она нужна. Как собственно и было задумано.
Re[3]: vector::operator[], runtime check?
От: Alexander G Украина  
Дата: 27.10.09 15:52
Оценка:
Здравствуйте, 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.
Русский военный корабль идёт ко дну!
Re[2]: vector::operator[], runtime check?
От: Aleх  
Дата: 27.10.09 17:45
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, igna, Вы писали:


I>>С одной стороны не нашел как эту проверку отключить, с другой — стандарт ее не требует. С третьей стороны непонятно как такое поведение компилятора согласуется с философией языка не платить за то, что не используется.


AG>А мне нравится.

AG>И то, как реализовано бросание исключения: пользовательская функция в SetUnhandledExceptionFilter не учитывается.
AG>Нет, серьёзно.

AG>А когда очень хочется локально производительности при получении элементов вектора — можно работать с вектором через указатели.

Ну тогда уж можно и контейнер свой написать, который можно будет настраивать всеми мыслимыми способами.
Re[3]: vector::operator[], runtime check?
От: SleepyDrago Украина  
Дата: 27.10.09 20:45
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Можно. А еще можно отключить всеобщую проверку при помощи #define _SECURE_SCL 0 (http://rsdn.ru/forum/cpp/3582319.1.aspx) и использовать vector::at там, где она нужна. Как собственно и было задумано.


Большое количество проблем с переносимостью уходит если таскать стл с собой.
Макросы пробовать не советую — напоретесь на 3rd party binary и все будет мистически глючить.
Re[4]: vector::operator[], runtime check?
От: trophim Россия  
Дата: 30.10.09 20:29
Оценка:
да, мистику проходили...
...а совсем уж унылые куски кода придется найти при помощи профайлера и манипулировать ими как обычными массивами.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Let it be! — Давайте есть пчелу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.