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 代表发表的以下评论(已添加重点):

这个问题是否只发生在除了赋值之外没有以任何方式使用过的变量上?通过使用十六进制编辑器检查在 .pdb 中存在变量,或者在反汇编中看到相应的“mov”指令并不能保证编译器没有进行某种程度的优化以防止调试器检查变量(即使在调试版本中,编译器也总是进行小的优化)。如果变量在应用程序中用于其他目的而不是被赋值,调试器只能保证编译器将提供对变量的访问。

如果您有一个正在使用变量的重现(除了被分配一个值)并且您无法在调试器中检查它,请告诉我们。否则,这是编译器优化的产物。

从您发布的代码中不清楚您以后是否使用y.

于 2012-04-18T19:47:01.063 回答
2

它与优化有关。由于您没有使用分配给的变量,编译器选择不创建它们(在这种情况下是其中之一)。您使用它们的那一刻(在您的工作示例中,您从它们中的每一个中减去一个值)编译器无法再优化它们。

我在其他编译器中看到过这种行为,并且总是通过虚拟使用消失变量来解决它。

于 2012-04-18T19:28:12.707 回答