4

其他人可能感兴趣的一般问题:

我遇到了一个使用 switch 语句的 C++ 编译器优化 (Visual Studio 2005) 问题。我想知道的是是否有任何方法可以满足我的好奇心并找出编译器正在尝试但未能做到的事情。有没有我可以花一些时间(可能太多时间)破译的日志?

对于那些好奇地继续阅读的人来说,我的具体问题- 我想听听你对我为什么在这个具体案例中遇到问题的想法。

我有一个大约 500 行代码的小程序,其中包含一个 switch 语句。它的一些案例包含一些指针分配。

double *ptx, *pty, *ptz;
double **ppt = new double*[3];

//some code initializing etc ptx, pty and ptz 

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

中间的语句似乎挂了编译器。编译永远不会结束。好的,我没等多久就走下大厅,和一些人交谈,喝杯咖啡然后回到我的办公桌,但这是一个通常在不到一秒钟内编译的小程序。删除一行(上面代码中指出的那一行),问题就消失了,就像删除优化时一样(在整个程序上或在函数上使用#pragma)。

为什么这条中间线会引起问题?编译器优化器不喜欢 pty。程序中的向量 ptx、pty 和 ptz 没有区别。我对 pty 所做的一切都是对 ptx 和 ptz 所做的。我尝试在 ppt 中交换他们的位置,但 pty 仍然是导致问题的行。

我问这个是因为我很好奇正在发生的事情。代码被重写并且工作正常。

编辑: 大约两周后,我检查了与我上面描述的代码最接近的版本,我无法将其重新编辑以使其崩溃。这真的很烦人,尴尬和恼火。我会再试一次,但如果我不能很快打破它,我想这部分问题已经过时了,我会删除它。真的很抱歉耽误了您的时间。

4

4 回答 4

1

如果您需要在不进行太多更改的情况下使此代码可编译,请考虑使用memcpy您为ppt[1]. 这至少应该编译得很好。但是,您的问题似乎更像是源代码的另一部分导致了这种行为。

你也可以尝试把这些东西:

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

在另一个函数中。这也应该有助于编译器避免编译代码所采用的路径。

于 2009-09-10T11:49:40.360 回答
0

这可能是由于您声明了 ptx、pty 和 ptz 并优化了它们以使用相同的地址。然后此操作会导致您的代码稍后出现编译器问题。

尝试

static double *ptx;
static double *pty;
static double *ptz;
于 2009-09-15T10:56:27.247 回答
0

您是否尝试将 pty 重命名为其他名称(即 pt_y)?我遇到了几次(即使用变量“rect2”)某些名称似乎被“保留”的问题。

于 2009-09-10T09:54:58.277 回答
0

这听起来像一个编译器错误。您是否尝试过重新排序线路?例如,

ppt[1]=pty; 
ppt[0]=ptx;
ppt[2]=ptz;

此外,如果您处理分配的值会发生什么(这会在您的代码中引入错误,但可能会指示问题是指针还是数组),例如:

ppt[0] = pty;
ppt[1] = ptz;
ppt[2] = ptx;

(或类似的)。

于 2009-09-10T10:34:16.560 回答