Другие ответы очень хороши, но вы можете легко ответить на них самостоятельно этим методом .
ДОБАВЛЕНО: В ответ на комментарии позвольте мне показать вам, что я имею в виду. Я использую VC на Windows, но это работает на любом языке / ОС. Я взял вашу первую программу и увеличил размер до 20000, чтобы она работала достаточно долго. Затем, пока он работал, я сделал несколько стеков. Все они выглядят так:
std::vector<bool,std::allocator<bool> >::begin() line 93 + 25 bytes
std::vector<bool,std::allocator<bool> >::operator[]() line 132 + 37 bytes
main() line 24 + 12 bytes
mainCRTStartup() line 206 + 25 bytes
KERNEL32! 7c817077()
Так что это говорит о том, что он тратит, по существу, все своего времени на операцию индексации в строке 24, и причина, по которой он тратит это время, заключается в том, что оператор []
вызывает begin
оператор. Более подробно:
main() line 24 + 12 bytes
это код:
for(int j = 0; j < size; j++){
==> v[i] = true;
}
, который звонит:
std::vector<bool,std::allocator<bool> >::operator[]() line 132 + 37 bytes
это код (который я немного переформатировал):
reference operator[](size_type _P){
==> return (*(begin() + _P));
}
, который звонит:
std::vector<bool,std::allocator<bool> >::begin() line 93 + 25 bytes
который делает это (более подробно):
92: iterator begin()
93: {return (_First); }
00402890 push ebp
00402891 mov ebp,esp
00402893 sub esp,44h
00402896 push ebx
00402897 push esi
00402898 push edi
00402899 push ecx
0040289A lea edi,[ebp-44h]
0040289D mov ecx,11h
004028A2 mov eax,0CCCCCCCCh
004028A7 rep stos dword ptr [edi]
004028A9 pop ecx <===============
004028AA mov dword ptr [ebp-4],ecx
004028AD mov eax,dword ptr [ebp-4]
004028B0 mov eax,dword ptr [eax+4]
004028B3 pop edi
004028B4 pop esi
004028B5 pop ebx
004028B6 mov esp,ebp
004028B8 pop ebp
004028B9 ret
То, что он делает, - это запись 68 байт 0xCC
в стек (по какой-то причине отладки) как часть получения begin
адреса вектора, как часть вычисления адреса v[i]
, до выполняя задание.
Доля времени, которое он тратит на это, составляет почти 100%, потому что он делал это на каждом из нескольких взятых образцов. Могли бы вы догадаться, что именно этим он и занимался почти все свое время? Я не мог иметь.
Это, конечно, сборка Debug. Если вы переключитесь на сборку Release, но включите отладочную информацию, все эти функции будут встроены и оптимизированы, поэтому они будут работать примерно в 30 раз быстрее, и снова стековые выстрелы точно сообщают, что они делают.
Так что - люди могут сказать вам, что он может делать, но это показывает , как узнать для себя, что он действительно делает.
В вашей среде он, несомненно, будет другим.