停止转到优化g

时间:2013-03-08 19:24:39

标签: c++ templates optimization g++

在编写asm代码时,有一个技巧可以通过告诉cpu显式跳转到下一条指令来使代码减慢一两个周期。我正在考虑使用C ++模板做类似的事情。这是我的代码:

template <unsigned int c>
inline void adelay()
{
  goto x;
x:
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

虽然这个想法听起来很合理,但优化器似乎通过删除jmp代码来阻碍它。有什么想法可以实现吗?

背景

想要这样做的原因是减慢微控制器的代码,使其以非常特定的频率输出光束脉冲。这是一种非常专业的用途,除了低级硬件访问(例如编写驱动程序或编程微控制器)之外,这种用法并不常见。即便如此,我尽量避免这样的事情。不幸的是,这并不总是可以避免的。

3 个答案:

答案 0 :(得分:2)

这就是优化器应该做的 - 优化,包括删除非功能代码。 要么在编译器选项中完全禁用优化,要么使用其他方法来减慢程序的速度,有很多API可以让你在规定的时间内休眠。

答案 1 :(得分:2)

您可以添加此属性:

template <>
inline void __attribute__((optimize("O0"))) adelay<0>()
{
}

哪个应该阻止优化。虽然正如其他人所提到的那样,可能有更好的方法,但如果这纯粹是出于学习目的而不是一切好事。我通常使用this来快速验证汇编器输出,或者当我不在命令行时。

答案 2 :(得分:0)

感谢大家的帮助。我没有使用jmp指令,而是使用了nop指令:

template <unsigned int c>
inline void adelay() 
{
  asm("nop");
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

有一次,我使用引用一个稍微更粗略的volatile变量:

static volatile int _adelay = 0;
template <unsigned int c>
inline void adelay()
{
  _adelay;
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

当我内存不足时,这可能很有用。

再次感谢! :)

阿德里安