Re: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 12:13
Оценка: 3 (1)
https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away
Re[9]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 12:15
Оценка:
Здравствуйте, kov_serg, Вы писали:

Pzz>>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.

_>Точно: — У семи нянек детё без глаза.

У семи нянек 14 сисек.
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 12:18
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away


Спасибо, видел, но там толкового решения не нашёл, всё в итоге сводится к asm или нерабочие решения, была надежда, что что-то упустили на SO.
Re[3]: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 12:20
Оценка:
упустили самое важное
отсылки к стандарту
которые там по несколько раз приводили разнцыми цитатами
Re: Как сделать вечный цикл?
От: Muxa  
Дата: 16.09.23 13:24
Оценка:
vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?

https://godbolt.org/z/qnWzvM6eo
Re[8]: Как сделать вечный цикл?
От: Sm0ke Россия ksi
Дата: 16.09.23 13:39
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Нomunculus, Вы писали:


Pzz>>>Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...


Н>>Как и любое такое знание — из разряда умения постройки пирамид. Утратилось, потому что не нать


Pzz>Не, пустые циклу не опримизировать таки нать. Вообще, Си всегда был ценен именно тем, что позволял помимо всего прочего делать всякие низкоуровневые вещи. Причем хорошо вписанные в более высокоуровневую канву сишной программы.


Pzz>А если теперь в нем это постепенно отмирает, нафиг он вообще нужен?


Pzz>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.


Может просто пофиксить компилятор? Разве стандарт языка позволяет выкидывать пустые циклы?
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 13:41
Оценка:
Здравствуйте, Muxa, Вы писали:

vsb>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?


M>https://godbolt.org/z/qnWzvM6eo


Я так понял, разница в том, что у меня был C++, а в этом примере C. Это обусловлено разницей в стандартах или в clang для C прописано исключение?
Re[9]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 13:50
Оценка:
Здравствуйте, Sm0ke, Вы писали:

Pzz>>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.


S>Может просто пофиксить компилятор? Разве стандарт языка позволяет выкидывать пустые циклы?


Ну если они без побочных эффектов, окромя того, что процессор делом занимают, почему нет?

Я вообще не удивлюсь, если в нонешнем стандарте нескончаемый цикл без побочных эффектов — это UB. Лень смотреть...
Re[3]: Как сделать вечный цикл?
От: Muxa  
Дата: 16.09.23 13:52
Оценка: 14 (1)
vsb>>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
M>>https://godbolt.org/z/qnWzvM6eo
vsb>Я так понял, разница в том, что у меня был C++, а в этом примере C. Это обусловлено разницей в стандартах или в clang для C прописано исключение?

Так ты вроде и просил на С изначально.
Чем обусловлено
Я сам удивлен, но из всех компиляторов что я проверил только clang++ выкидывает такой цикл. Причем это только на транке, стабильные релизы не выкидывают.
ПС: хотя если еще проверить неармовые версии clang++, то начиная с 13-ой версии выкидывает цикл.
Отредактировано 16.09.2023 14:08 Muxa . Предыдущая версия . Еще …
Отредактировано 16.09.2023 13:56 Muxa . Предыдущая версия .
Re: .
От: Sm0ke Россия ksi
Дата: 16.09.23 15:35
Оценка: -1 :))
Почему компиляторы не следуют стандарту?

consteval функцию нельзя вызывать в run time
но это компилируется и работает ... link

#include <iostream>

consteval bool fn()
{
  return true;
}

int main()
{
  //static constinit
    bool b = fn();
  std::cout << b << '\n';
  return 0;
}
Re: Как сделать вечный цикл?
От: CRT  
Дата: 16.09.23 16:05
Оценка:
https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away
Re[2]: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 16:07
Оценка:
https://rsdn.org/forum/cpp/8600551.1
Автор: reversecode
Дата: 16.09.23

ох уж этот ктыв, все писаки ни одного читаки
Re[3]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.09.23 19:27
Оценка:
Здравствуйте, vsb, Вы писали:

R>>https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away


vsb>Спасибо, видел, но там толкового решения не нашёл, всё в итоге сводится к asm или нерабочие решения, была надежда, что что-то упустили на SO.


А чем asm не нравится, если это asm с пустым телом?
Ну вставь atomic_signal_fence(memory_order_seq_cst), это по сути то же самое, но без слова asm.
The God is real, unless declared integer.
Re[10]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.09.23 19:28
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я вообще не удивлюсь, если в нонешнем стандарте нескончаемый цикл без побочных эффектов — это UB.


Да.
The God is real, unless declared integer.
Re[2]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 16.09.23 19:35
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>А на каком, пардон, основании? Бесконечный цикл — это же не if (false). Совсем охренели эти оптимизаторы.

До многих это доходит медленно. Современный C++ полон таких подстав. И что самое интересно многие с пеной у рта яростно защищают такое положение дел тыкая носом в стандарт. Похоже там есть яркие представители нетрадиционной ориентации логики и именно они имеют решающий голос в таких вопросах.
Re: Как сделать вечный цикл?
От: Кодт Россия  
Дата: 16.09.23 21:53
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.

vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?

Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.
Поэтому компилятор его и выкидывает: имеет полное право

А какой смысл микроконтроллеру полностью нагрузить ядро?
Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?
Перекуём баги на фичи!
Re[2]: Как сделать вечный цикл?
От: andyp  
Дата: 16.09.23 22:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.


Вопрос про С был — там имхо это не так.
Re[2]: Как сделать вечный цикл?
От: cppguard  
Дата: 17.09.23 00:08
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>А какой смысл микроконтроллеру полностью нагрузить ядро?

Удваиваю вопрос. Сам уже полгода въезжая в тему микроконтроллеров, и пока не было нужды добавлять вечный безусловный цикл. Тихая оптимизация это, конечно, зло, стоило бы добавить предупреждение и для особо упоротых упорных добавить флаг -Wno-empty-loop.
Re[3]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 00:41
Оценка:
Здравствуйте, cppguard, Вы писали:

К>>А какой смысл микроконтроллеру полностью нагрузить ядро?

C>Удваиваю вопрос. Сам уже полгода въезжая в тему микроконтроллеров, и пока не было нужды добавлять вечный безусловный цикл. Тихая оптимизация это, конечно, зло, стоило бы добавить предупреждение и для особо упоротых упорных добавить флаг -Wno-empty-loop.

Очевидно же для отладки или для ожидании watchdog-а.
Re[2]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 00:48
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.

Именно поэтому этот стандарт хочется выкинуть к чертовой матери.

К>Поэтому компилятор его и выкидывает: имеет полное право

Вскоре ему стандарт разрешит убивать людей и вот тогда он оторвётся по полной

К>А какой смысл микроконтроллеру полностью нагрузить ядро?

Точка ожидания отладчика, watchdog-а или ядра прогревают для проверки теплоотвода, выход по переключению контекста в прерывании.

К>Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?

di
hlt

В некоторых DSP-никах после выполнения операции еще надо пару нопов добавлять иначе не работает. Или еще несколько команд после ret могут исполнят
А компилятор понимаешь всё малину с ног наголову переворачивает, зато по стандарту. Вместо того что бы помогать, он гадит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.