相关疑难解决方法(0)

如何防止GCC优化忙等待循环?

我想为Atmel AVR微控制器编写C代码固件.我将使用GCC编译它.此外,我想启用编译器优化(-Os-O2),因为我认为没有理由不启用它们,并且它们可能比手动编写汇编更快地生成更好的汇编方式.

但我想要一小段没有优化的代码.我想延迟函数的执行一段时间,因此我想写一个do-nothing循环只是为了浪费一些时间.不需要精确,只需等待一段时间.

/* How to NOT optimize this, while optimizing other code? */
unsigned char i, j;
j = 0;
while(--j) {
    i = 0;
    while(--i);
}
Run Code Online (Sandbox Code Playgroud)

由于AVR中的内存访问速度要慢得多,因此我希望i并将j其保存在CPU寄存器中.


更新:我刚刚发现UTIL/delay.hUTIL/delay_basic.hAVR libc库.尽管大多数情况下使用这些功能可能更好,但这个问题仍然有效且有趣.


相关问题:

c optimization gcc avr-gcc

62
推荐指数
4
解决办法
5万
查看次数

while的目的(1); C中的陈述

有什么用途while(1);?我知道while(1)(没有分号)无限循环,类似于自旋锁情况.但是我没看到哪里while(1);可以使用?

示例代码

if(!condition)
{ 
  while(1);
}
Run Code Online (Sandbox Code Playgroud)

注意:这不是do- while()或简单的情况while(1).

c while-loop

54
推荐指数
6
解决办法
4万
查看次数

编译器是否允许消除无限循环?

可以优化编译器删除无限循环,这不会改变任何数据,如

while(1) 
  /* noop */;
Run Code Online (Sandbox Code Playgroud)

从分析编译器可以推导出的数据流图,这样的循环是"死代码"而没有任何副作用.

是否删除了C90/C99标准禁止的无限循环?

C90或C99标准是否允许编译器删除此类循环?

更新:"Microsoft C版本6.0基本上做了这个优化.",请参阅caf的链接.

label: goto label;
return 0;
Run Code Online (Sandbox Code Playgroud)

将转变为

return 0;
Run Code Online (Sandbox Code Playgroud)

c compiler-construction optimization standards infinite-loop

30
推荐指数
3
解决办法
5512
查看次数

编译器是否允许删除无限循环,例如带有-O2的英特尔C++编译器?

以下测试代码在VS中使用调试或发布以及GCC中都能正确执行.它也适用于带调试的ICC,但在启用优化时却没有(-O2).

#include <cstdio>

class tClassA{
public:
  int m_first, m_last;

  tClassA() : m_first(0), m_last(0) {}
  ~tClassA() {}

  bool isEmpty() const {return (m_first == m_last);}
  void updateFirst() {m_first = m_first + 1;}
  void updateLast() {m_last = m_last + 1;}
  void doSomething() {printf("should not reach here\r\n");}
};

int main() {
  tClassA q;
  while(true) {
    while(q.isEmpty()) ;
    q.doSomething();
  }
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

它应该停在while(q.isEmpty()).-O2然而,当在ICC(发布)下启用时,它无限地开始"doSomething".

由于这是单线程程序并且 isEmpty()应该被评估为true,我发现ICC没有理由以这种方式行事?我想念什么吗?

c++ optimization icc

11
推荐指数
2
解决办法
1554
查看次数