【发布时间】:2014-06-19 03:30:40
【问题描述】:
正如this question 中所讨论的,C++11 优化了无限循环。
但是,在具有单一目的的嵌入式设备中,无限循环是有意义的,并且实际上经常使用。即使是完全空的while(1); 也可用于看门狗辅助复位。终止但为空的循环在嵌入式开发中也很有用。
有没有一种优雅的方法来明确告诉编译器不要删除空循环或无限循环,而不完全禁用优化?
【问题讨论】:
正如this question 中所讨论的,C++11 优化了无限循环。
但是,在具有单一目的的嵌入式设备中,无限循环是有意义的,并且实际上经常使用。即使是完全空的while(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();
}
【讨论】:
wait_forever() 具有noreturn 属性,是否还需要读取易失性i?如果是,那么这个属性解决了什么问题?
noreturn 告诉编译器在调用 noreturn 函数后可能永远无法继续执行。因此,它不必在调用此类函数后发出任何代码。