sadman писал(а):Просто эта история о конвейерах, о которой я узнал относительно недавно, заставила меня задуматься...
Лучше не задумываться
Это абсолютно ненужная микрооптимизация. В большинстве (тривиальных) случаев компилятор развернет цикл в один и тот же код, в котором, возможно, даже не будет goto
Выгрузка операций из конвеера займет сколько? Один такт процессора. Два? Это сильно отразится на программе? Только в случае, если пишется программа с реальным временем отклика. Но тогда она даже не под винду писаться будет и не под линукс
В прикладных приложениях задумываться о том, что процессору придется очищать очередь по меньшей мере глупо, потому что мы почти не знаем, какой код сгенерирует компилятор, особенно с агрессивной оптимизацией.
Например (не совсем о goto, но все же
)
Этот код майкрософтовский компилятор легко преобразовывает в:
Предусмотреть такое очень сложно, особенно если случаи нетривиальны.
Так что во вложенных циклах случай с флагами или присваиванием переменным значения абсолютно идентичен случаю с goto, потому что компилятор
возможно сводит все к goto. А возможно избавляется от goto.
В любом случае в прикладном приложении goto не может повлиять на производительность программы. Слишком много в таком приложении других, более дорогостоящих вещей. И если goto повысит читаемость кода, то я буду использовать goto
Кстати, многие парсеры и, емнип, конечные автоматы легче писать с goto. Автоматические парсеры/лексеры все равно порождают код с goto (
например). Так что не надо goto обижать. Оно иногда хорошее