Це питання, яке прийшло в голову під час читання блискучої відповіді Mysticial на запитання: чому швидше обробити відсортований масив, ніж несортований масив ?
Контекст для задіяних типів:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
У своїй відповіді він пояснює, що Intel Compiler (ICC) оптимізує це:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... у щось еквівалентне цьому:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Оптимізатор визнає, що вони еквівалентні, і тому обмінюється петлями , переміщуючи гілку за межами внутрішньої петлі. Дуже розумний!
Але чому це не робиться?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Сподіваємось, містичне (або хто-небудь інший) може дати не менш яскраву відповідь. Я ніколи не дізнавався про оптимізації, про які говорилося в тому іншому питанні раніше, тому я дуже вдячний за це.
volatile
, то обмін циклом також був би недійсною оптимізацією.