История изменений
Исправление firkax, (текущая версия) :
Не требует.
for(value=iter_first(list,&it); value; value=iter_next(list,&it)) {
}
это то же самое что
if(value=iter_first(list,&it)) do {
} while(value=iter_next(list,&it));
но записанное в наглядном виде. Выражение «value» в середине при включённом хотя бы -O1 скорее всего никаких лишних действий выполнять не будет (вот проверил даже: https://godbolt.org/z/M7PjaWh8v - асм-код одинаковый), а при -O0 это будет незначительная разница примерно в один лишний переход за весь цикл и одну лишнюю запись из регистра в память на итерацию. Ну, если мы хотим вручную до конца всё оптимизировать то возможно if-do-while и лучше, но -O0 всё равно будет медленнее чем -O1.
В некоторых случаях, когда стартовое условие и условие следующего цикла слишком непохожи друг на друга, я вроде и сам if-do-while писал, но это было крайне редко.
Исходная версия firkax, :
Не требует.
for(value=iter_first(list,&it); value; value=iter_next(list,&it)) {
}
это то же самое что
if(value=iter_first(list,&it)) do {
} while(value=iter_next(list,&it));
но записанное в наглядном виде. Выражение «value» в середине при включённом хотя бы -O1 скорее всего никаких лишних действий выполнять не будет (вот проверил даже: https://godbolt.org/z/M7PjaWh8v - асм-код одинаковый), а при -O0 это будет незначительная разница примерно в один лишний переход за весь цикл и одну лишнюю запись из регистра в память на итерацию. Ну, если мы хотим вручную до конца всё оптимизировать то возможно if-do-while и лучше.
В некоторых случаях, когда стартовое условие и условие следующего цикла слишком непохожи друг на друга, я вроде и сам if-do-while писал, но это было крайне редко.