一般性问题:
我遇到了一个,我相信,C ++ - 编译器优化(Visual Studio 2005)问题与switch语句。我想知道的是,是否有任何方法可以满足我的好奇心并找出编译器正在尝试但未能做到的事情。有没有我可以花一些时间(可能是太多时间)破译的日志?
我的具体问题对于那些有兴趣继续阅读的人 - 我想听听你对我在这个具体案例中遇到问题的看法。
我有一个包含switch语句的大约500行代码的小程序。它的一些案例包含一些指针赋值。
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没有区别。我做的一切都是为了ptx和ptz。我尝试在ppt中交换他们的位置,但pty仍然是导致问题的线。
我问这个是因为我很好奇发生了什么。代码被重写并且工作正常。
修改 差不多两个星期后,我查看了上面描述的代码最接近的版本,我无法编辑它以使其崩溃。这真令人讨厌,令人尴尬和烦恼。我会再试一次,但如果我不能很快打破它,我想这部分问题已经过时了,我会删除它。真的很抱歉花时间。
答案 0 :(得分:1)
如果您需要对此代码进行编译而不进行太多更改,请考虑使用memcpy
为ppt[1]
指定值。这应该至少编译好。
但是,您的问题似乎更像是源代码的另一部分导致此行为。
你还可以试试这个东西:
ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;
在另一个功能中。 这也应该有助于编译器避免编译代码所采用的路径。
答案 1 :(得分:0)
您是否尝试将pty重命名为其他内容(即pt_y)?我遇到过几次(即变量“rect2”)某些名称似乎是“保留”的问题。
答案 2 :(得分:0)
这听起来像编译错误。你试过重新订购线路吗?例如,
ppt[1]=pty;
ppt[0]=ptx;
ppt[2]=ptz;
如果你玩弄分配的值(这将在你的代码中引入错误,但可能指示它的指针或数组是否是问题)会发生什么情况,例如:
ppt[0] = pty;
ppt[1] = ptz;
ppt[2] = ptx;
(或类似)。
答案 3 :(得分:0)
这可能是由于您声明ptx,pty和ptz,并将它们优化为使用相同的地址。然后,此操作会在您的代码中导致编译器出现问题。
尝试
static double *ptx;
static double *pty;
static double *ptz;