3 ms·
For the it++ case: std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >
by apta 9y ago
For the it++ case:
std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > >::operator++, COMDAT PROC
mov rax, QWORD PTR [rcx]
mov QWORD PTR [rdx], rax
add rax, 32 ; 00000020H
mov QWORD PTR [rcx], rax
mov rax, rdx
ret 0
For the ++it case:
std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > >::operator++, COMDAT PROC
add QWORD PTR [rcx], 32 ; 00000020H
mov rax, rcx
ret
- vardump 9y agoInterestingly the code you quoted is not called at all. I guess eventually linking phase removes it as dead code. That considered, both pre- and post-increment generate identical code, even with VS2017. This matches my previous experience about pretty much any compiler in last 15 years or so -- there's no difference between ++i and i++, unless, of course, it's in a statement and changes the actual meaning of code. "it++" case. Note that iterator function is not called. foo PROC mov rdx, QWORD PTR [rcx] xor eax, eax mov rcx, QWORD PTR [rcx+8] cmp rdx, rcx je SHORT $LN70@foo mov r8, rcx sub r8, rdx sar r8, 5 npad 8 $LL4@foo: add rax, r8 add rdx, 32 ; 00000020H cmp rdx, rcx jne SHORT $LL4@foo $LN70@foo: ret 0 foo ENDP Here's the code generated for "++it" case. Iterator function is not called here either. foo PROC mov rdx, QWORD PTR [rcx] xor eax, eax mov rcx, QWORD PTR [rcx+8] cmp rdx, rcx je SHORT $LN68@foo mov r8, rcx sub r8, rdx sar r8, 5 npad 8 $LL4@foo: add rax, r8 add rdx, 32 ; 00000020H cmp rdx, rcx jne SHORT $LL4@foo $LN68@foo: ret 0 foo ENDP