Да, у меня ошибка.
Но Ваш код от исходного в общем-то ничем не отличается, так же первый условный переход плохо предсказываем и может выполняться без выхода из цикла, т.е. нарушает линейность выполнения.
Тогда как сделать без операции | вместо || (или & вместо &&) я не знаю. А это не есть good practice.
Тогда считаю лучшим решение
worm2.
-- 30.07.2018, 20:36 --А зачем менять потинкремент на прединкремент? что так быстрее будет?
Для изменения простой переменной - нет, практически одинаково (при достаточно умном компиляторе). А вот в сложных выражениях, в принципе да, будет быстрее. Сравните требуемые операции:
Код:
b=*++p;
//Прочитать p
//Увеличить
//Сохранить обратно
//Использовать как адрес
Код:
b=*p++;
//Прочитать p
//Скопировать - вот и лишняя операция и лишний регистр, которых и так мало
//Увеличить копию
//Сохранить обратно
//Использовать как адрес
Возможен и ещё хуже вариант (зависит от компилятора):
Код:
b=*p++;
//Прочитать p
//Использовать как адрес
//Снова прочитать p - чтение памяти медленнее обращения к регистрам
//Увеличить
//Сохранить обратно
На самом деле всё это сильно зависит и от компилятора, и от процессора, и от окружающего кода. Например копирование регистра часто бесплатно, времени не занимает. Или чтение переменной из кэша тоже может времени не требовать (если будет предсказано правильно и data path свободен).
Так что на такие мелочи обращать внимание себе дороже, если только профилировщик прямо показывает что тормоза именно в них.