Компиляторы обычно сосредотачивают свои усилия (и должны концентрировать свои усилия) на местах, где конструкции , которые, вероятно, будут использоваться программистами, заинтересованными в эффективности , могут быть заменены другими конструкциями , которые легко доказываются как эквивалентен во всех случаях, которые должны иметь значение . Если n
является константой, компилятор может определить точный набор индексов массива, который будет использоваться в l oop, а затем выяснить, как обрабатывать все эти индексы. Если n
не является константой, компилятор может определить, что если n
положительно, код будет использовать все индексы от 0
до n*n-1
, но это, вероятно, потребует гораздо больших усилий. Авторы clang и, возможно, смогли бы сделать такое определение в этом случае, если бы они достаточно старались, но они, вероятно, думали, что усилия не стоили.
Обратите внимание, что если код будет использовать несколько конкретных значений из n
гораздо больше, чем любые другие, поскольку код явно проверяет эти значения и использует специально разработанные для них циклы, компилятор может генерировать гораздо более эффективный код для этих циклов, чем это было бы возможно для циклов, которые могут использовать произвольные n
. Поскольку многие проблемы реального мира, вероятно, будут иметь некоторые значения n
, которые используются гораздо чаще, чем другие, для автора компилятора было бы разумным предположить, что программисты, заинтересованные в производительности, могут использовать такие циклы специального назначения, и тратить определенное количество усилий на улучшение произвольного - n
l oop может дать меньшую выгоду, чем тратить такое же количество усилий в другом месте.