防止C++ 11删除无限循环

vsz*_*vsz 8 c++ embedded c++11

正如在这个问题中所讨论的,C++ 11优化了无限循环.

然而,在具有单一目的的嵌入式设备中,无限循环是有意义的并且实际上经常被使用.即使是完全空的while(1);也适用于看门狗辅助复位.终止但空循环在嵌入式开发中也很有用.

是否有一种优雅的方式来专门告诉编译器不要删除空循环或无限循环,而不完全禁用优化?

Jon*_*art 9

要删除循环的要求之一(如该问题中所述)就是它

  • 不访问或修改易失性对象

所以,

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}
Run Code Online (Sandbox Code Playgroud)

应该这样做,虽然我肯定会通过查看使用您的特定工具链生成的程序的反汇编来验证这一点.

像这样的函数也是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();
}
Run Code Online (Sandbox Code Playgroud)