История изменений
Исправление 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);
}