Блог пользователя baukaman

Автор baukaman, 12 лет назад, По-русски

Сегодня попробовал запустить

#include<iostream>

using namespace std;

int main(){

 long long cnt=0;

 for(int i=0;i<1000000;i++)
 for(int j=0;j<1000000;j++)
 for(int k=0;k<1000000;k++)
 cnt++;

 cout<<cnt;

return 0;}

в запуске codeforces и он работал 31мс. Как такое возможно? в Ejudge тожe не ловит time limit? Может компилятор заранее предпосчитывает сколько надо прибавить? Непонятно...

  • Проголосовать: нравится
  • -1
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится -18 Проголосовать: не нравится

Просчитывает и думает, что за идиот написал три вложенных цикла, которые ничего не делают.

»
12 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Компилятор умный, он уже видит, какой будет результат, и напрямую выполняет эквивалент

cout << 1000000000000000000LL;
»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +10 Проголосовать: не нравится

насколько я знаю это называется dead loop optimization

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

На сервере при запуске включена опция -O2, которая оптимизирует все подряд, что нужно и что не нужно. В данном случае эта оптимизация во много раз ускорила программу, но здесь описывается баг, связанный с этой функцией.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

GNU C++ весьма суров и умеет такое "впихивать" в TL, а вот MS Visual C++ 2005 не умеет (по крайней мере с теми параметрами, которые на CF и некоторых других серверах)