3

ビジーウェイト機能が必要です。

for(long int j=0; j<50000000; ++j)
  ;

リリースモードでコンパイルすると、これは最適化されます。デバッグモードでコンパイルする以外に、これを最適化しないようにする方法はありますか?ループの実際の数は特に気にしませんが、それは目立ったビジー遅延であるに違いありません。

4

1 に答える 1

5

CPUをビジー状態に保つ必要がある理由はわかりませんが、CPUをビジー状態に保つことを確認して、先週発生した中断を考慮せずにすべてを取得するなど、本当に正当な理由があると仮定しましょう。落ち込んでいるが、私は逸脱します...

あなたが見ている問題は、コンパイラが「デッドコード除去」を実行することです。ループが何もしない(つまり、副作用がない)ことを確認し、それを切り取ります。だからあなたはそれを副作用にすることができます。

簡単な解決策は次の関数です。

void busywait(long iterations)
{
    for(volatile long i = 0; i != iterations; i++)
        ;
}

揮発性オブジェクトへのストア(つまり、実行するインクリメント)は副作用があるものとして扱われるため、ループに副作用があることを確認していることを示すマークiを付けます。volatile

于 2012-12-20T22:37:52.987 に答える