Предотвращение удаления С++ 11 бесконечных циклов

Как обсуждалось в этом вопросе, С++ 11 оптимизирует бесконечные циклы.

Однако во встроенных устройствах, которые имеют одну цель, бесконечные циклы имеют смысл и на самом деле довольно часто используются. Даже пустой пуст while(1); полезен для reset с поддержкой сторожевого таймера. Завершающие, но пустые петли также могут быть полезны во встроенной разработке.

Есть ли элегантный способ конкретно сказать компилятору не удалять пустые или бесконечные циклы, вообще не отключая оптимизацию?

Ответ 1

Одно из требований к удалению цикла (как упоминалось в этом вопросе) заключается в том, что он

  • не имеет доступа или изменения изменчивых объектов

Итак,

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}

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

Подобная функция будет хорошим кандидатом для атрибута GCC noreturn.

void wait_forever(void) __attribute__ ((noreturn));

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}

int main(void)
{
    if (something_bad_happened)
        wait_forever();
}