3

オブジェクト内のフィールドとしてペアのベクトルがあります。このオブジェクトには、ベクトル内のペアの値にアクセスする必要があるメソッドがあります。アクセスしたいベクトル内の場所を指すためにイテレータを使用しています。ベクトルを含むコードのスニペットを次に示します。

ヘッダー ファイル内:

vector<pair<double, double> > points;
vector<pair<double, double> >::iterator headingTo;

コンストラクターで:

 points.push_back(make_pair(1700.00, 3300.00));//Plus 20 or so other values
 headingTo = points.begin();

メソッド内:

double x = headingTo->first - positionX;
double y = headingTo->second - positionY;

ただし、このコードを実行すると y が作成されません。ブレークポイントを使用して変数を表示すると、Visual Studio にまったく表示されません。ただし、行を入れ替えると、y にはアクセスできますが、x にはアクセスできません。何か案は?

編集:次の作品を見つけました:

double headingToX = headingTo->first; 
headingToX -= positionX;
double headingToY = headingTo->second;
headingToY-= positionY;
4

2 に答える 2

3

プログラムの最適化されたビルドをデバッグしていないことを確認してください。その場合、プログラムの必要な出力を生成するために変数が必要ないと判断できる場合、コンパイラは変数を自由に省略できます。

ただし、最適化されていないビルドを使用している場合でも、実際に変数をまったく使用しないと、この動作が発生する可能性があります。VC++ 2010 の Express バージョンに関するこのバグ レポートでは、Microsoft の担当者による次のコメントが表示されます (強調を追加)。

この問題は、値を代入する以外に使用していない変数でのみ発生していますか? 16 進エディターを使用した検査による .pdb 内の変数の存在、または逆アセンブリ内の対応する「mov」命令の確認は、コンパイラーがデバッガーによる変数の検査を妨げる特定レベルの最適化を行わなかったことを保証するものではありません(コンパイラは、デバッグ ビルドでも常に小さな最適化を行います)。変数が値の割り当て以外の別の目的でアプリケーションで使用されている場合、デバッガーは変数へのアクセスがコンパイラーによって提供されることのみを保証できます。

変数が使用されている (値が割り当てられている以外の) 再現があり、デバッガーでそれを調べることができない場合は、お知らせください。それ以外の場合、これはコンパイラの最適化による成果物です。

投稿したコードからは、後で の値を使用するかどうかは不明ですy

于 2012-04-18T19:47:01.063 に答える
2

それは最適化に関連しています。割り当てた変数を使用していないため、コンパイラはそれらを作成しないことを選択しました (この場合はそのうちの 1 つ)。それらを使用した瞬間(実際の例では、それぞれから値を差し引いたもの)、コンパイラはそれらを最適化できなくなりました。

私は他のコンパイラでこの動作を見てきましたが、消える変数をダミーで使用することで常に解決していました。

于 2012-04-18T19:28:12.707 に答える