LINUX.ORG.RU

История изменений

Исправление 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 писал, но это было крайне редко.