我需要一个忙等待的功能。
for(long int j=0; j<50000000; ++j)
;
当我在发布模式下编译时,这会得到优化。除了在调试模式下编译之外,还有什么方法可以导致它没有得到优化吗?我并不特别关心循环的实际数量,但它一定是一个明显的忙延迟。
我需要一个忙等待的功能。
for(long int j=0; j<50000000; ++j)
;
当我在发布模式下编译时,这会得到优化。除了在调试模式下编译之外,还有什么方法可以导致它没有得到优化吗?我并不特别关心循环的实际数量,但它一定是一个明显的忙延迟。
我不知道你为什么需要让 CPU 保持忙碌,但让我们假设你真的有充分的理由,比如确保让 CPU 保持忙碌,这样它就不会考虑上周经历的分手并得到所有郁闷,但我离题了...
您看到的问题是编译器执行“死代码消除”:它看到循环什么都不做(即没有副作用),因此将其删除。所以你可以让它有副作用。
一个简单的解决方案是这个函数:
void busywait(long iterations)
{
for(volatile long i = 0; i != iterations; i++)
;
}
通过标记i
为volatile
确保循环具有副作用,因为存储到 volatile 对象(即我们执行的递增)被视为具有副作用。