Prevent C++11 removal of endless loops

痴心易碎 提交于 2019-12-04 03:13:43

问题


As discussed in this question, C++11 optimizes endless loops away.

However, in embedded devices which have a single purpose, endless loops make sense and are actually quite often used. Even a completely empty while(1); is useful for a watchdog-assisted reset. Terminating but empty loops can also be useful in embedded development.

Is there an elegant way to specifically tell the compiler to not remove empty or endless loops, without disabling optimization altogether?


回答1:


One of the requirements for a loop to be removed (as mentioned in that question) is that it

  • does not access or modify volatile objects

So,

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

should do the trick, although I would certainly verify this by looking at the disassembly of a program produced with your particular toolchain.

A function like this would be a good candidate for GCC's noreturn attribute as well.

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();
}


来源:https://stackoverflow.com/questions/24298314/prevent-c11-removal-of-endless-loops

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!