Есть такая структура
struct f
{
...
// здесь хранятся индексы другого вектора
std::vector<size_t> ir;
std::vector<size_t> ic;
...
};
f l;
size_t k;
В одной функции есть строчка
1. size_t i = l.ir[k];
AMDшный CodeXl расскрывает по этой строчке такой код:
mov edi,ecx
shl edi,04h
mov [ebp-10h],edi
----- break -----
mov eax,[ebx+1ch]
mov ebx,[ebx+4ch]
mov edi,[ebp-18h]
mov [ebp-20h],eax
----- break -----
mov eax,[ebp-20h]
lea ecx,[edx*4+00000000h]
---- break -----
mov eax,[eax+ecx]
И вторая строчка
2. size_t j = l.ic[k];
Компилируется в
xor esi,esi
mov [ebp-10h],esi
----- break -----
movsd xmm4,[ebp-34h]
----- break -----
movsd xmm5,[ebp-3ch]
----- break -----
mov eax,[edi+40h]
----- break -----
lea edi,[eax+ebx*4]
mov ecx,ebx
shl ecx,05h
sub edx,ebx
mov ebx,[ebp-14h]
lea ecx,[ecx+00h]
mov eax,[edi]
add edi,04h
И первый вариант, судя по логам профайлера, выполняется в 3 раза дольше.
Почему первый раз выполняется дольше?
Почему вообще ассемблерный код у этих вариантов отличается?