Если вы обеспокоены эффективностью вашего цикла, я призываю вас попробовать это:
Получите этот код, скомпилированный и запущенный в среде IDE, такой как Visual Studio, и установите точку останова в начале. Когда вы туда доберетесь, переключитесь на вид разборки (вид инструкций) и начните нажимать клавишу F11 (одношаговый) и сохраняйте подсчет того, сколько раз вы нажимаете на нее.
Вы увидите, что он входит в цикл, сравнивает i
с 25, а затем начинает делать код для строки cout
. Это включает в себя увеличение letter
, а затем переход к процедуре <<
для cout. Он делает там много вещей, возможно, углубляясь в подпрограммы и т. Д., И, наконец, возвращается, возвращая объект. Затем он выдвигает "\t"
в качестве аргумента и передает его этому объекту, возвращается и выполняет все то, что делал раньше. Затем он принимает number
, увеличивает его и передает его в подпрограмму cout::<<
, которая принимает целое число, вызывает функцию для преобразования ее в строку (которая включает цикл), а затем выполняет всю работу, которую он делал до цикла эту строку в выходной буфер и вернуть.
Устали? Вы еще не закончили. endl
должен быть выведен, и когда это происходит, он не только помещает "\n"
в буфер, но и вызывает системную подпрограмму для сброса этого буфера в файл или консоль, куда вы отправляете ввод / вывод. Вы, вероятно, не можете использовать F11, но будьте уверены, это займет много циклов и не вернется, пока не будет выполнен ввод / вывод.
К настоящему времени ваш F11-счет должен составлять около нескольких тысяч, более или менее.
Наконец, вы выходите и получаете оператор ++i
, который принимает 1 или 2 инструкции и возвращается к началу цикла, чтобы начать следующую итерацию.
СЕЙЧАС, вы все еще беспокоитесь об эффективности цикла?
Есть более простой способ сделать это, и он так же поучителен. Оберните бесконечный цикл вокруг всего вашего кода, чтобы он работал вечно. Пока он работает, нажмите кнопку «пауза» в IDE и посмотрите на стек вызовов. (Это называется «стопкой».) Если вы сделаете это несколько раз, вы получите хорошее представление о том, как он проводит время. Вот пример:
NTDLL! 7c90e514()
KERNEL32! 7c81cbfe()
KERNEL32! 7c81cc75()
KERNEL32! 7c81cc89()
MSVCRTD! 1021bed3()
MSVCRTD! 1021bd59()
MSVCRTD! 10218833()
MSVCRTD! 1023a500()
std::_Fputc() line 42 + 18 bytes
std::basic_filebuf<char,std::char_traits<char> >::overflow() line 108 + 25 bytes
std::basic_streambuf<char,std::char_traits<char> >::sputc() line 85 + 94 bytes
std::ostreambuf_iterator<char,std::char_traits<char> >::operator=() line 304 + 24 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Putc() line 633 + 32 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Iput() line 615 + 25 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::do_put() line 481 + 71 bytes
std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::put() line 444 + 44 bytes
std::basic_ostream<char,std::char_traits<char> >::operator<<() line 115 + 114 bytes
main() line 43 + 96 bytes
mainCRTStartup() line 338 + 17 bytes
Я делал это несколько раз, и ОДНАЖДЫ это не останавливалось в коде для внешнего цикла i<=25
. Поэтому оптимизация этой петли - это как чья-то метафора: «стричься, чтобы похудеть».