Те, що сказав ваш вчитель, було деяким косою заявою без особливих пояснень. Це НЕ, що декрементація швидша, ніж приріст, але ви можете створювати набагато швидший цикл із зменшенням, ніж із збільшенням.
Без роздумів про це, без необхідності використання лічильника циклу тощо - важливим є лише швидкість і кількість циклу (не нульовий).
Ось як реалізує цикл з 10 ітерацій:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
У 99% випадків це все, що може знадобитися, але поряд з PHP, PYTHON, JavaScript існує цілий світ критичного програмного забезпечення часу (як правило, вбудована, ОС, ігри тощо), де галочки процесора дійсно мають значення, тому коротко подивіться на код складання:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
після компіляції (без оптимізації) компільована версія може виглядати приблизно так (VS2015):
-------- C7 45 B0 00 00 00 00 mov dword ptr [i],0
-------- EB 09 jmp labelB
labelA 8B 45 B0 mov eax,dword ptr [i]
-------- 83 C0 01 add eax,1
-------- 89 45 B0 mov dword ptr [i],eax
labelB 83 7D B0 0A cmp dword ptr [i],0Ah
-------- 7D 02 jge out1
-------- EB EF jmp labelA
out1:
Усього циклу 8 інструкцій (26 байт). У ньому - насправді 6 інструкцій (17 байт) з 2 гілками. Так, я знаю, що це можна зробити краще (це лише приклад).
Тепер розглянемо цю частий конструкт, який ви часто знайдете написаним вбудованим розробником:
i = 10;
do
{
//something here
} while (--i);
Він також повторюється в 10 разів (так, я знаю, що значення я відрізняється порівняно з показаним для циклу, але тут ми дбаємо про кількість ітерацій). Це може бути складено в це:
00074EBC C7 45 B0 01 00 00 00 mov dword ptr [i],1
00074EC3 8B 45 B0 mov eax,dword ptr [i]
00074EC6 83 E8 01 sub eax,1
00074EC9 89 45 B0 mov dword ptr [i],eax
00074ECC 75 F5 jne main+0C3h (074EC3h)
5 інструкцій (18 байт) і лише одна гілка. Насправді в циклі є 4 інструкції (11 байт).
Найкраще те, що деякі ЦП (сумісні з x86 / x64 включені) мають інструкцію, яка може зменшити реєстр, пізніше порівняти результат з нулем і виконати відділення, якщо результат відрізняється від нуля. Практично ВСІ ПК на ПК реалізують цю інструкцію. Використовуючи це цикл, насправді є лише одна (так одна) 2-байтна інструкція:
00144ECE B9 0A 00 00 00 mov ecx,0Ah
label:
// something here
00144ED3 E2 FE loop label (0144ED3h) // decrement ecx and jump to label if not zero
Чи потрібно пояснювати, що швидше?
Зараз, навіть якщо певний процесор не виконує вище інструкцію, все, що потрібно для наслідування, це зменшення, що супроводжується умовним стрибком, якщо результат попередньої інструкції дорівнює нулю.
Тож незалежно від деяких випадків, які ви можете вказати як коментар, чому я помиляюся і т. Д. ІНФІЗАЦІЯ - ТАК ЦЕ БЕЗПЕЧНО ДЛЯ ШЛЯХУВАННЯ ВНУТРІВ, якщо ви знаєте, як, чому і коли.
PS. Так, я знаю, що мудрий компілятор (з відповідним рівнем оптимізації) перезапише цикл (із зростаючим лічильником циклу) у do..із еквівалентним для постійних ітерацій циклу ... (або розкрутити його) ...