LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Тут три операции, и он пытается выполнить две сразу на пентиуме. Причём не важно, одна тут переменная, или две. Если одна(UB), то код ессно терпит fail.

Если бы дело было только в параллельности, то они просто выполнились бы последовательно (в том порядке, в котором сформированы ассемблерные команды). Это не такой уж fail. Не буду больше повторяться.

И у тебя тут не «для всех», а «хотя-бы для одного».

Для всех. Он не одну строчку выведет «есть в таблице», а все 256.

оптимизатор работает так, как будто-бы никаких UB не бывает и быть не может

Вот эта строчка в стандарте мне и не нравится.

а потом передаётся в функцию? Тогда наверное нет.

Я же тебе написал код:

int table[4];
bool exists_in_table(int v)
{
  for (int i = 0; i <= 4; i++) {
    if (table[i] == v) return true;
  }
  return false;
}

int main()
{
   for (int i = 0; i < 255; i++)
      if(exists_in_table(i)) printf("%i in table\n", i);
}

Но точнее можно сказать лишь изучив листинг дизассемблера. Меня уже компилятор ничем не удивит, там Over9000 видов оптимизаций, из которых я знаю только 1%.

А листинг полностью совпадает с листингом программы

int main()
{
   for (int i = 0; i < 255; i++)
      printf("%i in table\n", i);
}

Исходная версия monk, :

Тут три операции, и он пытается выполнить две сразу на пентиуме. Причём не важно, одна тут переменная, или две. Если одна(UB), то код ессно терпит fail.

Если бы дело было только в параллельности, то они просто выполнились бы последовательно (в том порядке, в котором сформированы ассемблерные команды). Это не такой уж fail. Не буду больше повторяться.

И у тебя тут не «для всех», а «хотя-бы для одного».

Для всех. Он не одну строчку выведет «есть в таблице», а все 256.

оптимизатор работает так, как будто-бы никаких UB не бывает и быть не может

Вот эта строчка в стандарте мне и не нравится.

а потом передаётся в функцию? Тогда наверное нет.

Я же тебе написал код:

int table[4];
bool exists_in_table(int v)
{
  for (int i = 0; i <= 4; i++) {
    if (table[i] == v) return true;
  }
  return false;
}

int main()
{
   for (int i = 0; i < 255; i++)
      if(exists_in_table(i)) printf("%i in table\n", i);
}

Но точнее можно сказать лишь изучив листинг дизассемблера. Меня уже компилятор ничем не удивит, там Over9000 видов оптимизаций, из которых я знаю только 1%.

А листинг полностью совпадает с листингом программы

int main()
{
   for (int i = 0; i < 255; i++)
      printf("%i in table\n", i);
}