Основная разница между foreach
и for
заключается в более высоком уровне
абстракция foreach
-петля. foreach
петля обычно снижается до некоторой
for
- петля компилятором. Это имеет (как минимум) четыре преимущества:
- Читабельность :
foreach (a; someArray) doSomething(a);
по своей природе больше
удобочитаемее, чем for (size_t i = 0; i < someArray.length; i++) doSomething(someArray[i]);
.
Это становится еще понятнее, если тип someArray
не является простым массивом.
- Гибкость : если в какой-то момент времени вы решите, что тип
someArray
должен быть изменен с некоторого массива, скажем, на диапазон или объект
(например, для реализации параллельного цикла), foreach
остается неизменным, тогда как
for
-loop должен быть изменен для использования empty
, front
и popFront
(в случае диапазона) или opApply
, или какой-то другой механизм в случае
класс или структура.
- Специальные функции , например, перебор типов кортежей, декодирование UTF-8 и
Струны UTF-16.
- Производительность : петля
foreach
позволяет компилятору решать, как оптимально
реализовать цикл на основе типа (итерации по массиву, диапазон,
строка, объект ...) и, возможно, другая информация (например, размер
тип). Это обеспечивает эффективную реализацию для всех типов и других компиляторов.
оптимизация без необходимости беспокоиться о реализации
подробности. На самом деле производительность foreach
по отношению к ручному кодированию for
смешанный foreach(dchar c; someString) {...}
(то есть декодирование UTF-8
Строка во время цикла) очень быстро. Но foreach(a; someObject) {...}
, где
someObject
реализует opApply
, немного медленнее (потому что тело цикла
обернутый в делегат и opApply обычно вызывает этот делегат внутри цикла, который
генерирует некоторые накладные расходы). Как обычно, это не имеет значения для вашего кода в 99,99%
в случаях, когда foreach
всегда будет давать (как минимум) достойную реализацию.
Основным недостатком (кроме, иногда, скорости) является то, что некоторые вещи не могут
быть сделано с foreach
, а именно с множеством мутаций зацикливаемой вещи
(например, изменение размера массива в теле цикла).