Есть несколько нишевых вертикалей, в которых goto все еще широко используется в качестве стандартной практики некоторыми очень умными людьми, и в этих настройках нет предвзятого отношения к goto. Раньше я работал в компании, специализирующейся на симуляции, где весь локальный код на Fortran содержал тонны gotos, команда была очень умной, а программное обеспечение работало почти безупречно.
Итак, мы можем оставить в стороне достоинство goto, и если вопрос заключается просто в сравнении циклов, то мы делаем это путем профилирования и / или сравнения кода сборки. Тем не менее, вопрос включает в себя такие утверждения, как printf и т. Д. Вы не можете обсуждать оптимизацию логики управления циклами при этом. Также, как отмечали другие, все эти циклы будут генерировать ОЧЕНЬ похожие машинные коды.
Все условные ветви считаются «принятыми» (истинными) в конвейерных архитектурах процессоров в любом случае до фазы декодирования, в дополнение к небольшим циклам, которые обычно расширяются до состояния без цикла. Таким образом, в соответствии с пунктом Харпера выше, для goto нереально иметь какое-либо преимущество в простом управлении циклами (точно так же, как и в то время, когда они не имеют преимущества друг над другом). GOTO имеет смысл, как правило, в нескольких вложенных циклах или нескольких вложенных if, при добавлении дополнительного условия, проверенного goto, в КАЖДЫЙ из вложенных циклов или вложенных ifs неоптимально.
При оптимизации операции поиска в простом цикле использование часового иногда более эффективно, чем что-либо еще. По сути, добавляя фиктивное значение в конец массива, вы можете избежать проверки того, что два условия (конец массива и найденное значение) являются только одним условием (найденное значение), и это экономит на операциях cmp внутри. Я не знаю, автоматически ли это делают компиляторы.