1

g++ を含む最新の cygwin を実行しています。

コンパイラ フラグに -O0 が含まれていても、関数呼び出しが最適化されているように見えます。

関数はこのループから呼び出されます (すべてのコードは例のために簡略化されています)。

void my_func ( void )
{
    for ( int i = 0; i < 2; i++) {
        var1 = table[i];
        printf("i = %d\n", i);
        function_to_call();
        printf("Called the function\n");
     }
}

それが呼び出す関数は次のようなものです:

void function_to_call()
{
   int internal_var = var1;
   // do some math using internal_var, passing the result
   // as an input to another function

   printf("var1: %d\n", internal_var);
}

これを実行すると、出力は次のようになります。

i = 0
var1 = 0
Called the function
i = 1
Called the function

なぜこうなった?ループのたびに function_to_call() を呼び出す必要があります。以下は、stdout から直接取得したコンパイラ出力の抜粋です。

 g++ -O0 -Wall -Wno-write-stings -Wextra
4

2 に答える 2

1

まず、出力例がである間、function_to_call()出力は画像の「一部」にすぎません。それでも、もし私がその問題を突き刺さなければならなかったら……。var1: ...var1 = ...

void function_to_call()
{
   int internal_var = var1;
   // do some math using internal_var, passing the result
   // as an input to another function

   printf("var1: %d\n", internal_var);
}

「数学をやってください...」のセクションは、早期の復帰を余儀なくされていると思います。ただし、入力(おそらくでグローバル変数として渡されるvar1)が特定の値に設定されている場合のみ。

于 2012-09-14T16:22:23.240 に答える
0

私が不完全なコード サンプルを投稿したことは間違いありません。この関数には実際には return ステートメントはありませんが、原因がわかりました。function_to_call() のコードはステート マシンにあります。何が起こっていたかというと、そのコードが完了する前に状態が変更されたため、次回は別のケースに入ったということです。すべての人に謝罪し、教訓を学びました。あなたの努力に感謝します。

于 2012-09-14T18:02:48.437 に答える