ビジーウェイト機能が必要です。
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