Краткий ответ:
Нет никакой разницы между i++
и ++i
с точки зрения скорости. Хороший компилятор не должен генерировать разный код в обоих случаях.
Длинный ответ:
В каждом другом ответе не упоминается, что разница между ++i
и i++
имеет смысл только в том выражении, в котором оно найдено.
В случае for(i=0; i<n; i++)
, i++
является единственным в своем собственном выражении: перед i++
есть точка последовательности, а после нее - одна. Таким образом, единственным генерируемым машинным кодом является «увеличение i
на 1
», и четко определено, как это упорядочено по отношению к остальной части программы. Поэтому, если вы измените его на префикс ++
, это не будет иметь никакого значения, вы все равно просто получите машинный код "увеличение i
на 1
".
Различия между ++i
и i++
имеют значение только в таких выражениях, как array[i++] = x;
против array[++i] = x;
. Некоторые могут поспорить и сказать, что постфикс будет медленнее в таких операциях, потому что регистр, в котором находится i
, должен быть перезагружен позже. Но затем обратите внимание, что компилятор может свободно упорядочивать ваши инструкции любым удобным для них способом, если только он не «нарушает поведение абстрактной машины», как это называется в стандарте C.
Таким образом, вы можете предположить, что array[i++] = x;
переводится в машинный код как:
- Сохраните значение
i
в регистре A.
- Сохранить адрес массива в регистре B.
- Добавьте A и B, сохраните результаты в A.
- По этому новому адресу, представленному буквой A, сохраните значение x.
- Сохранить значение
i
в регистре A // неэффективно, потому что здесь дополнительная инструкция, мы уже делали это один раз.
- Инкрементный регистр А.
- Хранить регистр A в
i
.
компилятор может также сгенерировать код более эффективно, например:
- Хранить значение
i
в регистре А.
- Сохранить адрес массива в регистре B.
- Добавьте A и B, сохраните результаты в B.
- Инкрементный регистр A.
- Хранить регистр A в
i
.
- ... // остальной код.
Только потому, что вы, как программист на Си, обучены думать, что постфикс ++
происходит в конце, машинный код не должен быть упорядочен таким образом.
Так что нет никакой разницы между префиксом и постфиксом ++
в C. Теперь то, чем вы, программист C, должны быть разными, это люди, которые непоследовательно используют префикс в некоторых случаях и postfix в других, без какого-либо объяснения, почему. Это говорит о том, что они не уверены в том, как работает C, или что они неправильно владеют языком. Это всегда плохой признак, это, в свою очередь, говорит о том, что они принимают другие сомнительные решения в своей программе, основанные на суеверии или «религиозных догмах».
«Префикс ++
всегда быстрее» - действительно одна из таких ложных догм, которая распространена среди потенциальных программистов на Си.